From 56509055d23986479f472d667625426f51074992 Mon Sep 17 00:00:00 2001 From: Patrick Monnerat Date: Thu, 12 Oct 2017 16:42:02 +0100 Subject: cli tool: use file2memory() to buffer stdin in -F option. Closes PR https://github.com/curl/curl/pull/1985 --- src/tool_formparse.c | 53 +++++++++++++++------------------------------------- 1 file changed, 15 insertions(+), 38 deletions(-) (limited to 'src/tool_formparse.c') 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) -- cgit v1.2.3