diff options
author | Daniel Stenberg <daniel@haxx.se> | 2020-09-11 10:49:24 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2020-09-14 12:33:48 +0200 |
commit | 0938f828bfa3c06416e6b4fb1be67340485466f6 (patch) | |
tree | e42c7dd3bc4213f71bf0f41d6514c9cb79315d25 /src | |
parent | da5ae38db0642dc6f676217a7d77119cda4cce5a (diff) | |
download | curl-0938f828bfa3c06416e6b4fb1be67340485466f6.tar.gz |
curl: make file2string use dynbuf
Closes #5952
Diffstat (limited to 'src')
-rw-r--r-- | src/tool_paramhlp.c | 41 |
1 files changed, 9 insertions, 32 deletions
diff --git a/src/tool_paramhlp.c b/src/tool_paramhlp.c index e57daa2e1..f60d4f957 100644 --- a/src/tool_paramhlp.c +++ b/src/tool_paramhlp.c @@ -34,6 +34,7 @@ #include "tool_msgs.h" #include "tool_paramhlp.h" #include "tool_version.h" +#include "dynbuf.h" #include "memdebug.h" /* keep this as LAST include */ @@ -56,51 +57,27 @@ struct getout *new_getout(struct OperationConfig *config) return node; } +#define MAX_FILE2STRING (256*1024*1024) /* big enough ? */ + ParameterError file2string(char **bufp, FILE *file) { - char *string = NULL; + struct curlx_dynbuf dyn; + curlx_dyn_init(&dyn, MAX_FILE2STRING); if(file) { - char *ptr; - size_t alloc = 512; - size_t alloc_needed; char buffer[256]; - size_t stringlen = 0; - string = calloc(1, alloc); - if(!string) - return PARAM_NO_MEM; while(fgets(buffer, sizeof(buffer), file)) { - size_t buflen; - ptr = strchr(buffer, '\r'); + char *ptr = strchr(buffer, '\r'); if(ptr) *ptr = '\0'; ptr = strchr(buffer, '\n'); if(ptr) *ptr = '\0'; - buflen = strlen(buffer); - alloc_needed = stringlen + buflen + 1; - if(alloc < alloc_needed) { -#if SIZEOF_SIZE_T < 8 - if(alloc >= (size_t)SIZE_T_MAX/2) { - Curl_safefree(string); - return PARAM_NO_MEM; - } -#endif - /* doubling is enough since the string to add is always max 256 bytes - and the alloc size start at 512 */ - alloc *= 2; - ptr = realloc(string, alloc); - if(!ptr) { - Curl_safefree(string); - return PARAM_NO_MEM; - } - string = ptr; - } - strcpy(string + stringlen, buffer); - stringlen += buflen; + if(curlx_dyn_add(&dyn, buffer)) + return PARAM_NO_MEM; } } - *bufp = string; + *bufp = curlx_dyn_ptr(&dyn); return PARAM_OK; } |