diff options
| author | John Vogel <jvogel@stygian.me> | 2024-12-14 00:40:59 -0500 |
|---|---|---|
| committer | John Vogel <jvogel@stygian.me> | 2024-12-14 00:40:59 -0500 |
| commit | aba880f759d649bddbc1bafef9c4a8b7486b8d10 (patch) | |
| tree | 486299c85163c9fad6493f8a53a492455dd7c112 /cvsps/02_dynamicbufferalloc.patch | |
| parent | 7ee4e89dd35826f5ca04309ae1368f2967356d76 (diff) | |
| download | my-aports-aba880f759d649bddbc1bafef9c4a8b7486b8d10.tar.gz | |
local/cvsps: new aport
Diffstat (limited to 'cvsps/02_dynamicbufferalloc.patch')
| -rw-r--r-- | cvsps/02_dynamicbufferalloc.patch | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/cvsps/02_dynamicbufferalloc.patch b/cvsps/02_dynamicbufferalloc.patch new file mode 100644 index 0000000..abedad6 --- /dev/null +++ b/cvsps/02_dynamicbufferalloc.patch @@ -0,0 +1,117 @@ +Author: <crafterm@debian.org> +Description: Dynamic buffer allocation +--- a/cache.c ++++ b/cache.c +@@ -108,10 +108,19 @@ + int tag_flags = 0; + char branchbuff[LOG_STR_MAX] = ""; + int branch_add = 0; +- char logbuff[LOG_STR_MAX] = ""; ++ int logbufflen = LOG_STR_MAX + 1; ++ char * logbuff = malloc(logbufflen); + time_t cache_date = -1; + int read_version; + ++ if (logbuff == NULL) ++ { ++ debug(DEBUG_SYSERROR, "could not malloc %d bytes for logbuff in read_cache", logbufflen); ++ exit(1); ++ } ++ ++ logbuff[0] = 0; ++ + if (!(fp = cache_open("r"))) + goto out; + +@@ -299,8 +308,19 @@ + else + { + /* Make sure we have enough in the buffer */ +- if (strlen(logbuff)+strlen(buff)<LOG_STR_MAX) +- strcat(logbuff, buff); ++ int len = strlen(buff); ++ if (strlen(logbuff) + len >= LOG_STR_MAX) ++ { ++ logbufflen += (len >= LOG_STR_MAX ? (len+1) : LOG_STR_MAX); ++ char * newlogbuff = realloc(logbuff, logbufflen); ++ if (newlogbuff == NULL) ++ { ++ debug(DEBUG_SYSERROR, "could not realloc %d bytes for logbuff in read_cache", logbufflen); ++ exit(1); ++ } ++ logbuff = newlogbuff; ++ } ++ strcat(logbuff, buff); + } + break; + case CACHE_NEED_PS_MEMBERS: +@@ -332,6 +352,7 @@ + out_close: + fclose(fp); + out: ++ free(logbuff); + return cache_date; + } + +--- a/cvsps.c ++++ b/cvsps.c +@@ -265,7 +265,8 @@ + PatchSetMember * psm = NULL; + char datebuff[20]; + char authbuff[AUTH_STR_MAX]; +- char logbuff[LOG_STR_MAX + 1]; ++ int logbufflen = LOG_STR_MAX + 1; ++ char * logbuff = malloc(logbufflen); + int loglen = 0; + int have_log = 0; + char cmd[BUFSIZ]; +@@ -273,6 +274,12 @@ + char use_rep_buff[PATH_MAX]; + char * ltype; + ++ if (logbuff == NULL) ++ { ++ debug(DEBUG_SYSERROR, "could not malloc %d bytes for logbuff in load_from_cvs", logbufflen); ++ exit(1); ++ } ++ + if (!no_rlog && !test_log_file && cvs_check_cap(CAP_HAVE_RLOG)) + { + ltype = "rlog"; +@@ -480,24 +487,22 @@ + */ + if (have_log || !is_revision_metadata(buff)) + { +- /* if the log buffer is full, that's it. +- * +- * Also, read lines (fgets) always have \n in them +- * which we count on. So if truncation happens, +- * be careful to put a \n on. +- * +- * Buffer has LOG_STR_MAX + 1 for room for \0 if +- * necessary +- */ +- if (loglen < LOG_STR_MAX) ++ /* If the log buffer is full, try to reallocate more. */ ++ if (loglen < logbufflen) + { + int len = strlen(buff); + +- if (len >= LOG_STR_MAX - loglen) ++ if (len >= logbufflen - loglen) + { +- debug(DEBUG_APPMSG1, "WARNING: maximum log length exceeded, truncating log"); +- len = LOG_STR_MAX - loglen; +- buff[len - 1] = '\n'; ++ debug(DEBUG_STATUS, "reallocating logbufflen to %d bytes for file %s", logbufflen, file->filename); ++ logbufflen += (len >= LOG_STR_MAX ? (len+1) : LOG_STR_MAX); ++ char * newlogbuff = realloc(logbuff, logbufflen); ++ if (newlogbuff == NULL) ++ { ++ debug(DEBUG_SYSERROR, "could not realloc %d bytes for logbuff in load_from_cvs", logbufflen); ++ exit(1); ++ } ++ logbuff = newlogbuff; + } + + debug(DEBUG_STATUS, "appending %s to log", buff); |
