diff options
Diffstat (limited to 'src/tool_paramhlp.c')
-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; } |