1
0
mirror of https://github.com/moparisthebest/curl synced 2024-11-16 14:35:03 -05:00

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
This commit is contained in:
Gilles Vollant 2019-09-12 10:09:22 +02:00 committed by Daniel Stenberg
parent a56a47ac33
commit b543f1fadb
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2

View File

@ -58,12 +58,17 @@ struct getout *new_getout(struct OperationConfig *config)
ParameterError file2string(char **bufp, FILE *file) ParameterError file2string(char **bufp, FILE *file)
{ {
char *ptr;
char *string = NULL; char *string = NULL;
if(file) { if(file) {
char *ptr;
size_t alloc = 512;
size_t alloc_needed;
char buffer[256]; char buffer[256];
size_t stringlen = 0; size_t stringlen = 0;
string = malloc(alloc);
if(!string)
return PARAM_NO_MEM;
while(fgets(buffer, sizeof(buffer), file)) { while(fgets(buffer, sizeof(buffer), file)) {
size_t buflen; size_t buflen;
ptr = strchr(buffer, '\r'); ptr = strchr(buffer, '\r');
@ -73,12 +78,24 @@ ParameterError file2string(char **bufp, FILE *file)
if(ptr) if(ptr)
*ptr = '\0'; *ptr = '\0';
buflen = strlen(buffer); buflen = strlen(buffer);
ptr = realloc(string, stringlen + buflen + 1); alloc_needed = stringlen + buflen + 1;
if(!ptr) { if(alloc < alloc_needed) {
Curl_safefree(string); #if SIZEOF_SIZE_T < 8
return PARAM_NO_MEM; 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); strcpy(string + stringlen, buffer);
stringlen += buflen; stringlen += buflen;
} }