summaryrefslogtreecommitdiff
path: root/cvsps/02_dynamicbufferalloc.patch
diff options
context:
space:
mode:
authorJohn Vogel <jvogel@stygian.me>2024-12-14 00:40:59 -0500
committerJohn Vogel <jvogel@stygian.me>2024-12-14 00:40:59 -0500
commitaba880f759d649bddbc1bafef9c4a8b7486b8d10 (patch)
tree486299c85163c9fad6493f8a53a492455dd7c112 /cvsps/02_dynamicbufferalloc.patch
parent7ee4e89dd35826f5ca04309ae1368f2967356d76 (diff)
downloadmy-aports-aba880f759d649bddbc1bafef9c4a8b7486b8d10.tar.gz
local/cvsps: new aport
Diffstat (limited to 'cvsps/02_dynamicbufferalloc.patch')
-rw-r--r--cvsps/02_dynamicbufferalloc.patch117
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);