diff --git a/talk/base/httpbase.cc b/talk/base/httpbase.cc index 90c1a78793..7d54ab8a92 100644 --- a/talk/base/httpbase.cc +++ b/talk/base/httpbase.cc @@ -166,12 +166,16 @@ HttpParser::ProcessLine(const char* line, size_t len, HttpError* error) { } while ((value < eol) && isspace(static_cast(*value))); size_t vlen = eol - value; if (MatchHeader(line, nlen, HH_CONTENT_LENGTH)) { - unsigned int temp_size; - if (sscanf(value, "%u", &temp_size) != 1) { + // sscanf isn't safe with strings that aren't null-terminated, and there + // is no guarantee that |value| is. + // Create a local copy that is null-terminated. + std::string value_str(value, vlen); + unsigned int temp_size; + if (sscanf(value_str.c_str(), "%u", &temp_size) != 1) { *error = HE_PROTOCOL; return PR_COMPLETE; } - data_size_ = static_cast(temp_size); + data_size_ = static_cast(temp_size); } else if (MatchHeader(line, nlen, HH_TRANSFER_ENCODING)) { if ((vlen == 7) && (_strnicmp(value, "chunked", 7) == 0)) { chunked_ = true; diff --git a/tools/valgrind-webrtc/memcheck/suppressions.txt b/tools/valgrind-webrtc/memcheck/suppressions.txt index 4e78a92d0f..49667ed2ee 100644 --- a/tools/valgrind-webrtc/memcheck/suppressions.txt +++ b/tools/valgrind-webrtc/memcheck/suppressions.txt @@ -917,27 +917,6 @@ fun:BIO_new_mem_buf fun:_ZN9talk_base15OpenSSLIdentity14FromPEMStringsERKSsS2_ } -# For sscanf -{ - sscanf_1 - Memcheck:Uninitialized - fun:__GI___rawmemchr - fun:_IO_str_init_static_internal - fun:vsscanf - fun:sscanf - fun:_ZN9talk_base16HttpResponseData11parseLeaderEPKcm - ... -} -{ - sscanf_2 - Memcheck:Uninitialized - fun:__GI___rawmemchr - fun:_IO_str_init_static_internal - fun:vsscanf - fun:sscanf - fun:_ZN9talk_base15HttpRequestData11parseLeaderEPKcm - ... -} # For HttpServer.SignalsCloseAfterForcedCloseAll { SignalsCloseAfterForcedCloseAll