126 lines
3.6 KiB
Text
126 lines
3.6 KiB
Text
|
#! /bin/sh /usr/share/dpatch/dpatch-run
|
||
|
## 02_dynamicbufferalloc.dpatch by <crafterm@debian.org>
|
||
|
##
|
||
|
## All lines beginning with `## DP:' are a description of the patch.
|
||
|
## DP: Dynamic buffer allocation
|
||
|
|
||
|
@DPATCH@
|
||
|
|
||
|
diff -urN cvsps-2.1-orig/cache.c cvsps-2.1/cache.c
|
||
|
--- cvsps-2.1-orig/cache.c 2005-05-25 22:39:40.000000000 -0500
|
||
|
+++ cvsps-2.1/cache.c 2005-07-26 15:21:29.716569500 -0500
|
||
|
@@ -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;
|
||
|
}
|
||
|
|
||
|
diff -urN cvsps-2.1-orig/cvsps.c cvsps-2.1/cvsps.c
|
||
|
--- cvsps-2.1-orig/cvsps.c 2005-05-25 22:39:40.000000000 -0500
|
||
|
+++ cvsps-2.1/cvsps.c 2005-07-26 15:22:02.558230700 -0500
|
||
|
@@ -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);
|