File 12711.patch of Package squid

---------------------
PatchSet 12711 
Date: 2011/08/26 21:51:44
Author: hno
Branch: SQUID_2_7
Tag: (none) 
Log:
Correct parsing of large gopher indexes

Members: 
	src/gopher.c:1.181.2.1->1.181.2.2 

Index: squid/src/gopher.c
===================================================================
RCS file: /cvsroot/squid/squid/src/gopher.c,v
retrieving revision 1.181.2.1
retrieving revision 1.181.2.2
diff -u -r1.181.2.1 -r1.181.2.2
--- squid/src/gopher.c	4 May 2008 23:23:13 -0000	1.181.2.1
+++ squid/src/gopher.c	26 Aug 2011 21:51:44 -0000	1.181.2.2
@@ -1,6 +1,6 @@
 
 /*
- * $Id: gopher.c,v 1.181.2.1 2008/05/04 23:23:13 hno Exp $
+ * $Id: gopher.c,v 1.181.2.2 2011/08/26 21:51:44 hno Exp $
  *
  * DEBUG: section 10    Gopher
  * AUTHOR: Harvest Derived
@@ -314,8 +314,6 @@
 	gopherState->HTML_header_added = 1;
 	return;
     }
-    inbuf[len] = '\0';
-
     if (!gopherState->HTML_header_added) {
 	if (gopherState->conversion == HTML_CSO_RESULT)
 	    gopherHTMLHeader(entry, "CSO Search Result", NULL);
@@ -325,66 +323,41 @@
 	gopherState->HTML_header_added = 1;
 	gopherState->HTML_pre = 1;
     }
-    while ((pos != NULL) && (pos < inbuf + len)) {
-
+    while (pos < inbuf + len) {
+	int llen;
+	int left = len - (pos - inbuf);
+	lpos = memchr(pos, '\n', left);
+	if (lpos) {
+	    lpos++;		/* Next line is after \n */
+	    llen = lpos - pos;
+	} else {
+	    llen = left;
+	}
+	if (gopherState->len + llen >= TEMP_BUF_SIZE) {
+	    debug(10, 1) ("gopherToHTML: Buffer overflow. Lost some data on URL: %s\n",
+		storeUrl(entry));
+	    llen = TEMP_BUF_SIZE - gopherState->len - 1;
+	}
+	if (!lpos) {
+	    /* there is no complete line in inbuf */
+	    /* copy it to temp buffer */
+	    /* note: llen is adjusted above */
+	    xmemcpy(gopherState->buf + gopherState->len, pos, llen);
+	    gopherState->len += llen;
+	    break;
+	}
 	if (gopherState->len != 0) {
 	    /* there is something left from last tx. */
-	    xstrncpy(line, gopherState->buf, gopherState->len + 1);
-	    if (gopherState->len + len > TEMP_BUF_SIZE) {
-		debug(10, 1) ("gopherToHTML: Buffer overflow. Lost some data on URL: %s\n",
-		    storeUrl(entry));
-		len = TEMP_BUF_SIZE - gopherState->len;
-	    }
-	    lpos = (char *) memccpy(line + gopherState->len, inbuf, '\n', len);
-	    if (lpos)
-		*lpos = '\0';
-	    else {
-		/* there is no complete line in inbuf */
-		/* copy it to temp buffer */
-		if (gopherState->len + len > TEMP_BUF_SIZE) {
-		    debug(10, 1) ("gopherToHTML: Buffer overflow. Lost some data on URL: %s\n",
-			storeUrl(entry));
-		    len = TEMP_BUF_SIZE - gopherState->len;
-		}
-		xmemcpy(gopherState->buf + gopherState->len, inbuf, len);
-		gopherState->len += len;
-		return;
-	    }
-
-	    /* skip one line */
-	    pos = (char *) memchr(pos, '\n', len);
-	    if (pos)
-		pos++;
-
-	    /* we're done with the remain from last tx. */
+	    xmemcpy(line, gopherState->buf, gopherState->len);
+	    xmemcpy(line + gopherState->len, pos, llen);
+	    llen += gopherState->len;
 	    gopherState->len = 0;
-	    *(gopherState->buf) = '\0';
 	} else {
-
-	    lpos = (char *) memccpy(line, pos, '\n', len - (pos - inbuf));
-	    if (lpos)
-		*lpos = '\0';
-	    else {
-		/* there is no complete line in inbuf */
-		/* copy it to temp buffer */
-		if ((len - (pos - inbuf)) > TEMP_BUF_SIZE) {
-		    debug(10, 1) ("gopherToHTML: Buffer overflow. Lost some data on URL: %s\n",
-			storeUrl(entry));
-		    len = TEMP_BUF_SIZE;
-		}
-		if (len > (pos - inbuf)) {
-		    xmemcpy(gopherState->buf, pos, len - (pos - inbuf));
-		    gopherState->len = len - (pos - inbuf);
-		}
-		break;
-	    }
-
-	    /* skip one line */
-	    pos = (char *) memchr(pos, '\n', len);
-	    if (pos)
-		pos++;
-
+	    xmemcpy(line, pos, llen);
 	}
+	line[llen + 1] = '\0';
+	/* move input to next line */
+	pos = lpos;
 
 	/* at this point. We should have one line in buffer to process */
 
openSUSE Build Service is sponsored by