summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGilles Vollant <vollant.g@gmail.com>2019-09-12 10:09:22 +0200
committerDaniel Stenberg <daniel@haxx.se>2019-09-13 08:22:58 +0200
commitb543f1fadb2989451ebec77e3aea0a3110d09630 (patch)
tree17c1ab20e03e222d58149db5a52042deec053056
parenta56a47ac33a8344c0a3f3f74bd4a6b07576f7e0a (diff)
downloadcurl-b543f1fadb2989451ebec77e3aea0a3110d09630.tar.gz
curl:file2string: load large files much faster
... by using a more efficient realloc scheme. Bug: https://curl.haxx.se/mail/lib-2019-09/0045.html Closes #4336
-rw-r--r--src/tool_paramhlp.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/src/tool_paramhlp.c b/src/tool_paramhlp.c
index c9dac4f0f..af47516b6 100644
--- a/src/tool_paramhlp.c
+++ b/src/tool_paramhlp.c
@@ -58,12 +58,17 @@ struct getout *new_getout(struct OperationConfig *config)
ParameterError file2string(char **bufp, FILE *file)
{
- char *ptr;
char *string = NULL;
-
if(file) {
+ char *ptr;
+ size_t alloc = 512;
+ size_t alloc_needed;
char buffer[256];
size_t stringlen = 0;
+ string = malloc(alloc);
+ if(!string)
+ return PARAM_NO_MEM;
+
while(fgets(buffer, sizeof(buffer), file)) {
size_t buflen;
ptr = strchr(buffer, '\r');
@@ -73,12 +78,24 @@ ParameterError file2string(char **bufp, FILE *file)
if(ptr)
*ptr = '\0';
buflen = strlen(buffer);
- ptr = realloc(string, stringlen + buflen + 1);
- if(!ptr) {
- Curl_safefree(string);
- return PARAM_NO_MEM;
+ 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;
}
- string = ptr;
strcpy(string + stringlen, buffer);
stringlen += buflen;
}