libminiupnpc: add upstream security fix for CVE-2017-8798
authorPeter Korsgaard <peter@korsgaard.com>
Fri, 19 May 2017 13:48:02 +0000 (15:48 +0200)
committerPeter Korsgaard <peter@korsgaard.com>
Sun, 21 May 2017 22:00:13 +0000 (00:00 +0200)
CVE-2017-8798: Integer signedness error in MiniUPnP MiniUPnPc v1.4.20101221
through v2.0 allows remote attackers to cause a denial of service or
possibly have unspecified other impact.

For more details including a PoC, see:
https://github.com/tintinweb/pub/tree/master/pocs/cve-2017-8798

Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
package/libminiupnpc/0001-miniupnpc-Fix-CVE-2017-8798.patch [new file with mode: 0644]

diff --git a/package/libminiupnpc/0001-miniupnpc-Fix-CVE-2017-8798.patch b/package/libminiupnpc/0001-miniupnpc-Fix-CVE-2017-8798.patch
new file mode 100644 (file)
index 0000000..25591fc
--- /dev/null
@@ -0,0 +1,59 @@
+From f0f1f4b22d6a98536377a1bb07e7c20e4703d229 Mon Sep 17 00:00:00 2001
+From: Thomas Bernard <miniupnp@free.fr>
+Date: Tue, 9 May 2017 12:00:47 +0200
+Subject: [PATCH] miniupnpc: Fix CVE-2017-8798
+
+Thanks to tin/Team OSTStrom
+
+[Peter: drop Changelog.txt modification, convert to -p1 format]
+Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
+---
+ miniupnpc/miniwget.c    | 12 +++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+diff --git a/miniwget.c b/miniwget.c
+index 37cb47b7..1eda57c5 100644
+--- a/miniwget.c
++++ b/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");