Commit b2ef79ef authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

Rudy Koento's problem fixed, test case 66 verifies this.

parent f488874f
Loading
Loading
Loading
Loading
+20 −9
Original line number Diff line number Diff line
@@ -285,6 +285,8 @@ CURLcode Curl_readwrite(struct connectdata *conn,
          /* header line within buffer loop */
          do {
            int hbufp_index;
            int rest_length;
            int full_length;
              
            /* str_start is start of line within buf */
            k->str_start = k->str;
@@ -326,22 +328,24 @@ CURLcode Curl_readwrite(struct connectdata *conn,
              break; /* read more and try again */
            }

            /* decrease the size of the remaining buffer */
            nread -= (k->end_ptr - k->str)+1; 
            /* decrease the size of the remaining (supposed) header line */
            rest_length = (k->end_ptr - k->str)+1;
            nread -= rest_length; 

            k->str = k->end_ptr + 1; /* move past new line */

            full_length = k->str - k->str_start;

            /*
             * We're about to copy a chunk of data to the end of the
             * already received header. We make sure that the full string
             * fit in the allocated header buffer, or else we enlarge 
             * it.
             */
            if (k->hbuflen + (k->str - k->str_start) >=
            if (k->hbuflen + full_length >=
                data->state.headersize) {
              char *newbuff;
              long newsize=MAX((k->hbuflen+
                                (k->str-k->str_start))*3/2,
              long newsize=MAX((k->hbuflen+full_length)*3/2,
                               data->state.headersize*2);
              hbufp_index = k->hbufp - data->state.headerbuff;
              newbuff = (char *)realloc(data->state.headerbuff, newsize);
@@ -355,9 +359,9 @@ CURLcode Curl_readwrite(struct connectdata *conn,
            }

            /* copy to end of line */
            strncpy (k->hbufp, k->str_start, k->str - k->str_start);
            k->hbufp += k->str - k->str_start;
            k->hbuflen += k->str - k->str_start;
            strncpy (k->hbufp, k->str_start, full_length);
            k->hbufp += full_length;
            k->hbuflen += full_length;
            *k->hbufp = 0;
              
            k->p = data->state.headerbuff;
@@ -372,7 +376,14 @@ CURLcode Curl_readwrite(struct connectdata *conn,
                 !checkhttpprefix(data, data->state.headerbuff)) {
                /* this is not the beginning of a HTTP first header line */
                k->header = FALSE;
                if(nread)
                  /* since there's more, this is a partial bad header */
                  k->badheader = HEADER_PARTHEADER;
                else {
                  /* this was all we read so its all a bad header */
                  k->badheader = HEADER_ALLBAD;
                  nread = rest_length;
                }
                break;
              }
            }