Ville Skyttä 3edd9c
# From: http://ydirson.free.fr/soft/git/cvsps.git
Ville Skyttä 3edd9c
Ville Skyttä 3edd9c
commit 76a9c2aaa0d2957de0bc8f0c0b994abfd1645a50
Ville Skyttä 3edd9c
Author: David D. Kilzer <ddkilzer@kilzer.net>
Ville Skyttä 3edd9c
Date:   Mon Jun 20 01:04:34 2005 +0200
Ville Skyttä 3edd9c
Ville Skyttä 3edd9c
    Dynamically allocate the log buffer to prevent warning messages
Ville Skyttä 3edd9c
    
Ville Skyttä 3edd9c
    On anoncvs.opensource.apple.com (Apple's anonymous CVS server for
Ville Skyttä 3edd9c
    WebKit), some very long log entries were included in CVS.  I got tired
Ville Skyttä 3edd9c
    of cvsps-2.1 truncating them, so I made the 'logbuff' buffer be
Ville Skyttä 3edd9c
    dynamically allocated.
Ville Skyttä 3edd9c
Ville Skyttä 3edd9c
diff --git i/cache.c w/cache.c
Ville Skyttä 3edd9c
index 4c51cf7..01a8ed3 100644
Ville Skyttä 3edd9c
--- i/cache.c
Ville Skyttä 3edd9c
+++ w/cache.c
Ville Skyttä 3edd9c
@@ -108,10 +108,19 @@ time_t read_cache()
Ville Skyttä 3edd9c
     int tag_flags = 0;
Ville Skyttä 3edd9c
     char branchbuff[LOG_STR_MAX] = "";
Ville Skyttä 3edd9c
     int branch_add = 0;
Ville Skyttä 3edd9c
-    char logbuff[LOG_STR_MAX] = "";
Ville Skyttä 3edd9c
+    int logbufflen = LOG_STR_MAX + 1;
Ville Skyttä 3edd9c
+    char * logbuff = malloc(logbufflen);
Ville Skyttä 3edd9c
     time_t cache_date = -1;
Ville Skyttä 3edd9c
     int read_version;
Ville Skyttä 3edd9c
 
Ville Skyttä 3edd9c
+    if (logbuff == NULL)
Ville Skyttä 3edd9c
+    {
Ville Skyttä 3edd9c
+	debug(DEBUG_SYSERROR, "could not malloc %d bytes for logbuff in read_cache", logbufflen);
Ville Skyttä 3edd9c
+	exit(1);
Ville Skyttä 3edd9c
+    }
Ville Skyttä 3edd9c
+
Ville Skyttä 3edd9c
+    logbuff[0] = 0;
Ville Skyttä 3edd9c
+
Ville Skyttä 3edd9c
     if (!(fp = cache_open("r")))
Ville Skyttä 3edd9c
 	goto out;
Ville Skyttä 3edd9c
 
Ville Skyttä 3edd9c
@@ -299,8 +308,19 @@ time_t read_cache()
Ville Skyttä 3edd9c
 	    else
Ville Skyttä 3edd9c
 	    {
Ville Skyttä 3edd9c
 		/* Make sure we have enough in the buffer */
Ville Skyttä 3edd9c
-		if (strlen(logbuff)+strlen(buff)
Ville Skyttä 3edd9c
-		    strcat(logbuff, buff);
Ville Skyttä 3edd9c
+		int len = strlen(buff);
Ville Skyttä 3edd9c
+		if (strlen(logbuff) + len >= LOG_STR_MAX)
Ville Skyttä 3edd9c
+		{
Ville Skyttä 3edd9c
+		    logbufflen += (len >= LOG_STR_MAX ? (len+1) : LOG_STR_MAX);
Ville Skyttä 3edd9c
+		    char * newlogbuff = realloc(logbuff, logbufflen);
Ville Skyttä 3edd9c
+		    if (newlogbuff == NULL)
Ville Skyttä 3edd9c
+		    {
Ville Skyttä 3edd9c
+			debug(DEBUG_SYSERROR, "could not realloc %d bytes for logbuff in read_cache", logbufflen);
Ville Skyttä 3edd9c
+			exit(1);
Ville Skyttä 3edd9c
+		    }
Ville Skyttä 3edd9c
+		    logbuff = newlogbuff;
Ville Skyttä 3edd9c
+		}
Ville Skyttä 3edd9c
+		strcat(logbuff, buff);
Ville Skyttä 3edd9c
 	    }
Ville Skyttä 3edd9c
 	    break;
Ville Skyttä 3edd9c
 	case CACHE_NEED_PS_MEMBERS:
Ville Skyttä 3edd9c
@@ -332,6 +352,7 @@ time_t read_cache()
Ville Skyttä 3edd9c
  out_close:
Ville Skyttä 3edd9c
     fclose(fp);
Ville Skyttä 3edd9c
  out:
Ville Skyttä 3edd9c
+    free(logbuff);
Ville Skyttä 3edd9c
     return cache_date;
Ville Skyttä 3edd9c
 }
Ville Skyttä 3edd9c
 
Ville Skyttä 3edd9c
diff --git i/cvsps.c w/cvsps.c
Ville Skyttä 3edd9c
index f0e7d29..db28d7c 100644
Ville Skyttä 3edd9c
--- i/cvsps.c
Ville Skyttä 3edd9c
+++ w/cvsps.c
Ville Skyttä 3edd9c
@@ -269,7 +269,8 @@ static void load_from_cvs()
Ville Skyttä 3edd9c
     PatchSetMember * psm = NULL;
Ville Skyttä 3edd9c
     char datebuff[26];
Ville Skyttä 3edd9c
     char authbuff[AUTH_STR_MAX];
Ville Skyttä 3edd9c
-    char logbuff[LOG_STR_MAX + 1];
Ville Skyttä 3edd9c
+    int logbufflen = LOG_STR_MAX + 1;
Ville Skyttä 3edd9c
+    char * logbuff = malloc(logbufflen);
Ville Skyttä 3edd9c
     int loglen = 0;
Ville Skyttä 3edd9c
     int have_log = 0;
Ville Skyttä 3edd9c
     char cmd[BUFSIZ];
Ville Skyttä 3edd9c
@@ -277,6 +278,12 @@ static void load_from_cvs()
Ville Skyttä 3edd9c
     char use_rep_buff[PATH_MAX];
Ville Skyttä 3edd9c
     char * ltype;
Ville Skyttä 3edd9c
 
Ville Skyttä 3edd9c
+    if (logbuff == NULL)
Ville Skyttä 3edd9c
+    {
Ville Skyttä 3edd9c
+	debug(DEBUG_SYSERROR, "could not malloc %d bytes for logbuff in load_from_cvs", logbufflen);
Ville Skyttä 3edd9c
+	exit(1);
Ville Skyttä 3edd9c
+    }
Ville Skyttä 3edd9c
+
Ville Skyttä 3edd9c
     if (!no_rlog && !test_log_file && cvs_check_cap(CAP_HAVE_RLOG))
Ville Skyttä 3edd9c
     {
Ville Skyttä 3edd9c
 	ltype = "rlog";
Ville Skyttä 3edd9c
@@ -484,25 +491,22 @@ static void load_from_cvs()
Ville Skyttä 3edd9c
 		 */
Ville Skyttä 3edd9c
 		if (have_log || !is_revision_metadata(buff))
Ville Skyttä 3edd9c
 		{
Ville Skyttä 3edd9c
-		    /* if the log buffer is full, that's it.  
Ville Skyttä 3edd9c
-		     * 
Ville Skyttä 3edd9c
-		     * Also, read lines (fgets) always have \n in them
Ville Skyttä 3edd9c
-		     * (unless truncation happens)
Ville Skyttä 3edd9c
-		     * which we count on.  So if truncation happens,
Ville Skyttä 3edd9c
-		     * be careful to put a \n on.
Ville Skyttä 3edd9c
-		     * 
Ville Skyttä 3edd9c
-		     * Buffer has LOG_STR_MAX + 1 for room for \0 if
Ville Skyttä 3edd9c
-		     * necessary
Ville Skyttä 3edd9c
-		     */
Ville Skyttä 3edd9c
-		    if (loglen < LOG_STR_MAX)
Ville Skyttä 3edd9c
+		    /* If the log buffer is full, try to reallocate more. */
Ville Skyttä 3edd9c
+		    if (loglen < logbufflen)
Ville Skyttä 3edd9c
 		    {
Ville Skyttä 3edd9c
 			int len = strlen(buff);
Ville Skyttä 3edd9c
 			
Ville Skyttä 3edd9c
-			if (len >= LOG_STR_MAX - loglen)
Ville Skyttä 3edd9c
+			if (len >= logbufflen - loglen)
Ville Skyttä 3edd9c
 			{
Ville Skyttä 3edd9c
-			    debug(DEBUG_APPMSG1, "WARNING: maximum log length exceeded, truncating log");
Ville Skyttä 3edd9c
-			    len = LOG_STR_MAX - loglen;
Ville Skyttä 3edd9c
-			    buff[len - 1] = '\n';
Ville Skyttä 3edd9c
+			    debug(DEBUG_STATUS, "reallocating logbufflen to %d bytes for file %s", logbufflen, file->filename);
Ville Skyttä 3edd9c
+			    logbufflen += (len >= LOG_STR_MAX ? (len+1) : LOG_STR_MAX);
Ville Skyttä 3edd9c
+			    char * newlogbuff = realloc(logbuff, logbufflen);
Ville Skyttä 3edd9c
+			    if (newlogbuff == NULL)
Ville Skyttä 3edd9c
+			    {
Ville Skyttä 3edd9c
+				debug(DEBUG_SYSERROR, "could not realloc %d bytes for logbuff in load_from_cvs", logbufflen);
Ville Skyttä 3edd9c
+				exit(1);
Ville Skyttä 3edd9c
+			    }
Ville Skyttä 3edd9c
+			    logbuff = newlogbuff;
Ville Skyttä 3edd9c
 			}
Ville Skyttä 3edd9c
 
Ville Skyttä 3edd9c
 			debug(DEBUG_STATUS, "appending %s to log", buff);