diff --git a/lib/http.c b/lib/http.c index 9af3a70514..6fdaa2e434 100644 --- a/lib/http.c +++ b/lib/http.c @@ -1440,6 +1440,10 @@ bool Curl_compareheader(const char *headerline, /* line to check */ do curlx_str_passblanks(&p); while(!curlx_str_single(&p, ',')); + /* trailing blanks may move the parsing point past the value end, + then there is nothing left to match */ + if((size_t)(p - o) > len) + break; len -= (p - o); } } diff --git a/tests/data/test1625 b/tests/data/test1625 index 58d661c385..c717933b30 100644 --- a/tests/data/test1625 +++ b/tests/data/test1625 @@ -19,7 +19,7 @@ Curl_compareheader unit test -31 invokes +33 invokes diff --git a/tests/unit/unit1625.c b/tests/unit/unit1625.c index 370b65a4fa..491b553954 100644 --- a/tests/unit/unit1625.c +++ b/tests/unit/unit1625.c @@ -102,6 +102,11 @@ static CURLcode test_unit1625(const char *arg) { "Encoding: super-nice", "Encoding:", "super-nice", TRUE }, /* hyphenated second token */ { "Encoding: extra-good, super-nice", "Encoding:", "super-nice", TRUE }, + /* trailing blanks after the last comma */ + { "Encoding: gzipped, ", "Encoding:", "gzip", FALSE }, + /* the scan must not cross into a second line */ + { "Encoding: gzipped, \r\nEncoding: gzip, chunked", "Encoding:", + "chunked", FALSE }, }; for(i = 0; i < CURL_ARRAYSIZE(list); i++) {