hc
2023-02-13 e440ec23c5a540cdd3f7464e8779219be6fd3d95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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");