From f0f1f4b22d6a98536377a1bb07e7c20e4703d229 Mon Sep 17 00:00:00 2001 From: Thomas Bernard Date: Tue, 9 May 2017 12:00:47 +0200 Subject: [PATCH] miniupnpc: Fix CVE-2017-8798 Thanks to tin/Team OSTStrom --- miniupnpc/Changelog.txt | 3 +++ miniupnpc/miniwget.c | 12 +++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/miniupnpc/Changelog.txt b/miniupnpc/Changelog.txt index 76d947b..a3ef518 100644 --- a/miniupnpc/Changelog.txt +++ b/miniupnpc/Changelog.txt @@ -1,6 +1,9 @@ $Id: Changelog.txt,v 1.226 2016/12/16 08:57:19 nanard Exp $ miniUPnP client Changelog. +2017/05/05: + Fix CVE-2017-8798 Thanks to tin/Team OSTStrom + 2016/11/11: check strlen before memcmp in XML parsing portlistingparse.c fix build under SOLARIS and CYGWIN diff --git a/miniupnpc/miniwget.c b/miniupnpc/miniwget.c index 37cb47b..1eda57c 100644 --- a/miniupnpc/miniwget.c +++ b/miniupnpc/miniwget.c @@ -284,11 +284,12 @@ getHTTPResponse(int s, int * size, int * status_code) goto end_of_stream; } } - bytestocopy = ((int)chunksize < (n - i))?chunksize:(unsigned int)(n - i); + /* it is guaranteed that (n >= i) */ + bytestocopy = (chunksize < (unsigned int)(n - i))?chunksize:(unsigned int)(n - i); if((content_buf_used + bytestocopy) > content_buf_len) { char * tmp; - if(content_length >= (int)(content_buf_used + bytestocopy)) { + if((content_length >= 0) && ((unsigned int)content_length >= (content_buf_used + bytestocopy))) { content_buf_len = content_length; } else { content_buf_len = content_buf_used + bytestocopy; @@ -313,14 +314,15 @@ getHTTPResponse(int s, int * size, int * status_code) { /* not chunked */ if(content_length > 0 - && (int)(content_buf_used + n) > content_length) { + && (content_buf_used + n) > (unsigned int)content_length) { /* skipping additional bytes */ n = content_length - content_buf_used; } if(content_buf_used + n > content_buf_len) { char * tmp; - if(content_length >= (int)(content_buf_used + n)) { + if(content_length >= 0 + && (unsigned int)content_length >= (content_buf_used + n)) { content_buf_len = content_length; } else { content_buf_len = content_buf_used + n; @@ -340,7 +342,7 @@ getHTTPResponse(int s, int * size, int * status_code) } } /* use the Content-Length header value if available */ - if(content_length > 0 && (int)content_buf_used >= content_length) + if(content_length > 0 && content_buf_used >= (unsigned int)content_length) { #ifdef DEBUG printf("End of HTTP content\n");