diff options
| -rw-r--r-- | lib/transfer.c | 29 | 
1 files changed, 20 insertions, 9 deletions
diff --git a/lib/transfer.c b/lib/transfer.c index 9bc9f1020..c321da1ee 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -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; -                k->badheader = HEADER_PARTHEADER; +                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;                }              }  | 
