1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-21 23:58:49 -05:00

cli tool: use file2memory() to buffer stdin in -F option.

Closes PR https://github.com/curl/curl/pull/1985
This commit is contained in:
Patrick Monnerat 2017-10-12 16:42:02 +01:00
parent 665b3e48bc
commit 56509055d2

View File

@ -32,12 +32,12 @@
#include "tool_convert.h" #include "tool_convert.h"
#include "tool_msgs.h" #include "tool_msgs.h"
#include "tool_binmode.h" #include "tool_binmode.h"
#include "tool_getparam.h"
#include "tool_paramhlp.h"
#include "tool_formparse.h" #include "tool_formparse.h"
#include "memdebug.h" /* keep this as LAST include */ #include "memdebug.h" /* keep this as LAST include */
#define STDIN_BUFSIZE 0x4000 /* Always have 16K to read more stdin data. */
/* Stdin parameters. */ /* Stdin parameters. */
typedef struct { typedef struct {
char *data; /* Memory data. */ char *data; /* Memory data. */
@ -474,46 +474,23 @@ static CURLcode file_or_stdin(curl_mimepart *part, const char *file)
if(sip->size < 0) if(sip->size < 0)
sip->size = 0; sip->size = 0;
} }
else { else { /* Not suitable for direct use, buffer stdin data. */
/* Not suitable for direct use, buffer stdin data. */ size_t stdinsize = 0;
sip->origin = 0; sip->origin = 0;
sip->size = 0; if(file2memory(&sip->data, &stdinsize, stdin) != PARAM_OK)
sip->curpos = STDIN_BUFSIZE; result = CURLE_OUT_OF_MEMORY;
sip->data = malloc(STDIN_BUFSIZE); else {
if(!sip->data) { if(!stdinsize)
stdin_free(sip); sip->data = NULL; /* Has been freed if no data. */
return CURLE_OUT_OF_MEMORY; sip->size = stdinsize;
if(ferror(stdin))
result = CURLE_READ_ERROR;
} }
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;
}
/* 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. */ /* Set remote file name. */
if(!result)
result = curl_mime_filename(part, file); result = curl_mime_filename(part, file);
/* Set part's data from callback. */ /* Set part's data from callback. */