]> granicus.if.org Git - curl/commitdiff
http2: fix incorrect trailer buffer size
authorZhouyihai Ding <ddyihai@ddyihai.svl.corp.google.com>
Wed, 10 Jan 2018 18:12:18 +0000 (10:12 -0800)
committerJay Satiro <raysatiro@yahoo.com>
Thu, 11 Jan 2018 07:33:24 +0000 (02:33 -0500)
Prior to this change the stored byte count of each trailer was
miscalculated and 1 less than required. It appears any trailer
after the first that was passed to Curl_client_write would be truncated
or corrupted as well as the size. Potentially the size of some
subsequent trailer could be erroneously extracted from the contents of
that trailer, and since that size is used by client write an
out-of-bounds read could occur and cause a crash or be otherwise
processed by client write.

The bug appears to have been born in 0761a51 (precedes 7.49.0).

Closes https://github.com/curl/curl/pull/2231

lib/http2.c

index 8e2fc719960a877cca8f333534ab4e2062a18540..699287940ed40e18c891063591b6ce96e9e9727a 100644 (file)
@@ -925,8 +925,8 @@ static int on_header(nghttp2_session *session, const nghttp2_frame *frame,
 
   if(stream->bodystarted) {
     /* This is trailer fields. */
-    /* 3 is for ":" and "\r\n". */
-    uint32_t n = (uint32_t)(namelen + valuelen + 3);
+    /* 4 is for ": " and "\r\n". */
+    uint32_t n = (uint32_t)(namelen + valuelen + 4);
 
     DEBUGF(infof(data_s, "h2 trailer: %.*s: %.*s\n", namelen, name, valuelen,
                  value));