summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Monnerat <patrick@monnerat.net>2017-10-12 16:42:02 +0100
committerPatrick Monnerat <patrick@monnerat.net>2017-10-12 16:42:02 +0100
commit56509055d23986479f472d667625426f51074992 (patch)
treed44e48051836ce083996fe741a25cd31b7757057
parent665b3e48bc95713ecceaddf445fc2049440a6fb3 (diff)
downloadcurl-56509055d23986479f472d667625426f51074992.tar.gz
cli tool: use file2memory() to buffer stdin in -F option.
Closes PR https://github.com/curl/curl/pull/1985
-rw-r--r--src/tool_formparse.c53
1 files changed, 15 insertions, 38 deletions
diff --git a/src/tool_formparse.c b/src/tool_formparse.c
index 976c3b795..b763d88a5 100644
--- a/src/tool_formparse.c
+++ b/src/tool_formparse.c
@@ -32,12 +32,12 @@
#include "tool_convert.h"
#include "tool_msgs.h"
#include "tool_binmode.h"
+#include "tool_getparam.h"
+#include "tool_paramhlp.h"
#include "tool_formparse.h"
#include "memdebug.h" /* keep this as LAST include */
-#define STDIN_BUFSIZE 0x4000 /* Always have 16K to read more stdin data. */
-
/* Stdin parameters. */
typedef struct {
char *data; /* Memory data. */
@@ -474,47 +474,24 @@ static CURLcode file_or_stdin(curl_mimepart *part, const char *file)
if(sip->size < 0)
sip->size = 0;
}
- else {
- /* Not suitable for direct use, buffer stdin data. */
+ else { /* Not suitable for direct use, buffer stdin data. */
+ size_t stdinsize = 0;
+
sip->origin = 0;
- sip->size = 0;
- sip->curpos = STDIN_BUFSIZE;
- sip->data = malloc(STDIN_BUFSIZE);
- if(!sip->data) {
- stdin_free(sip);
- return CURLE_OUT_OF_MEMORY;
- }
- for(;;) {
- size_t wantbytes = (size_t) (sip->curpos - sip->size);
- size_t havebytes = fread(sip->data + (size_t) sip->size, 1, wantbytes,
- stdin);
- char *p;
-
- sip->size += havebytes;
- if(ferror(stdin)) {
- stdin_free(sip);
- return CURLE_READ_ERROR;
- }
- if(!havebytes || feof(stdin))
- break;
-
- /* Enlarge data buffer. */
- p = realloc(sip->data, (size_t) sip->size + STDIN_BUFSIZE);
- if(!p) {
- stdin_free(sip);
- return CURLE_OUT_OF_MEMORY;
- }
- sip->data = p;
- sip->curpos = sip->size + STDIN_BUFSIZE;
+ if(file2memory(&sip->data, &stdinsize, stdin) != PARAM_OK)
+ result = CURLE_OUT_OF_MEMORY;
+ else {
+ if(!stdinsize)
+ sip->data = NULL; /* Has been freed if no data. */
+ sip->size = stdinsize;
+ if(ferror(stdin))
+ result = CURLE_READ_ERROR;
}
- /* Shrink buffer to spare memory resources. */
- if(sip->size < sip->curpos)
- sip->data = realloc(sip->data, (size_t) sip->size);
}
- sip->curpos = 0; /* Rewind. */
/* Set remote file name. */
- result = curl_mime_filename(part, file);
+ if(!result)
+ result = curl_mime_filename(part, file);
/* Set part's data from callback. */
if(!result)