[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gnurl] 10/222: curl:file2string: load large files much faster
From: |
gnunet |
Subject: |
[gnurl] 10/222: curl:file2string: load large files much faster |
Date: |
Thu, 07 Nov 2019 00:08:26 +0100 |
This is an automated email from the git hooks/post-receive script.
ng0 pushed a commit to branch master
in repository gnurl.
commit b543f1fadb2989451ebec77e3aea0a3110d09630
Author: Gilles Vollant <address@hidden>
AuthorDate: Thu Sep 12 10:09:22 2019 +0200
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
---
src/tool_paramhlp.c | 31 ++++++++++++++++++++++++-------
1 file 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;
}
--
To stop receiving notification emails like this one, please contact
address@hidden.
- [gnurl] 03/222: winbuild/MakefileBuild.vc: Add vssh, (continued)
- [gnurl] 03/222: winbuild/MakefileBuild.vc: Add vssh, gnunet, 2019/11/06
- [gnurl] 02/222: winbuild/MakefileBuild.vc: Fix line endings, gnunet, 2019/11/06
- [gnurl] 01/222: ldap: Stop using wide char version of ldapp_err2string, gnunet, 2019/11/06
- [gnurl] 08/222: docs/HTTP3: fix `--with-ssl` ngtcp2 configure flag, gnunet, 2019/11/06
- [gnurl] 06/222: curlver: bump to 7.66.1, gnunet, 2019/11/06
- [gnurl] 05/222: setopt: make it easier to add new enum values, gnunet, 2019/11/06
- [gnurl] 11/222: parsedate: still provide the name arrays when disabled, gnunet, 2019/11/06
- [gnurl] 12/222: curl: fix memory leaked by parse_metalink(), gnunet, 2019/11/06
- [gnurl] 07/222: RELEASE-NOTES: synced, gnunet, 2019/11/06
- [gnurl] 13/222: FTP: skip CWD to entry dir when target is absolute, gnunet, 2019/11/06
- [gnurl] 10/222: curl:file2string: load large files much faster,
gnunet <=
- [gnurl] 09/222: openssl: close_notify on the FTP data connection doesn't mean closure, gnunet, 2019/11/06
- [gnurl] 15/222: appveyor: add a winbuild, gnunet, 2019/11/06
- [gnurl] 23/222: smb: check for full size message before reading message details, gnunet, 2019/11/06
- [gnurl] 17/222: docs: fix typo in CURLOPT_HTTP_VERSION man, gnunet, 2019/11/06
- [gnurl] 18/222: docs: remove trailing ':' from section names in CURLOPT_TRAILER* man, gnunet, 2019/11/06
- [gnurl] 25/222: doh: clean up dangling DOH handles and memory on easy close, gnunet, 2019/11/06
- [gnurl] 14/222: FTP: allow "rubbish" prepended to the SIZE response, gnunet, 2019/11/06
- [gnurl] 22/222: quiche: persist connection details, gnunet, 2019/11/06
- [gnurl] 19/222: doh: fix (harmless) buffer overrun, gnunet, 2019/11/06
- [gnurl] 24/222: unit1655: make it C90 compliant, gnunet, 2019/11/06