7088912 Problem with utility/squid s11-sru S11SRU3_04
authorSrinivasa Sarva <srinivasa.sarva@oracle.com>
Tue, 20 Dec 2011 22:26:25 -0800
branchs11-sru
changeset 2238 cc3545c342fd
parent 2237 e330150e53c1
child 2239 f0bde9a421fe
7088912 Problem with utility/squid
components/squid/patches/src.gopher.cc.patch
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/squid/patches/src.gopher.cc.patch	Tue Dec 20 22:26:25 2011 -0800
@@ -0,0 +1,115 @@
+--- squid-3.1.8/src/gopher.cc	2010-09-03 20:25:58.000000000 -0700
++++ squid-3.1.8/src/gopher.cc	2011-12-02 22:18:46.000000000 -0800
[email protected]@ -425,7 +425,6 @@
+         return;
+     }
+ 
+-    inbuf[len] = '\0';
+     String outbuf;
+ 
+     if (!gopherState->HTML_header_added) {
[email protected]@ -441,75 +440,40 @@
+         gopherState->HTML_pre = 1;
+     }
+ 
+-    while ((pos != NULL) && (pos < inbuf + len)) {
+-
++    while (pos < inbuf + len) {
++        int llen;
++        int left = len - (pos - inbuf);
++        lpos = (char *)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) {
++            debugs(10, 1, "GopherHTML: Buffer overflow. Lost some data on URL: " << entry->url()  );
++            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) {
+-                debugs(10, 1, "GopherHTML: Buffer overflow. Lost some data on URL: " << entry->url()  );
+-                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) {
+-                    debugs(10, 1, "GopherHTML: Buffer overflow. Lost some data on URL: " << entry->url()  );
+-                    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) {
+-                    debugs(10, 1, "GopherHTML: Buffer overflow. Lost some data on URL: " << entry->url()  );
+-                    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 */
+