|
Lines 1-85
Link Here
|
| 1 |
Fix for CVE-2016-9179 |
|
|
| 2 |
See: |
| 3 |
http://lists.nongnu.org/archive/html/lynx-dev/2016-11/msg00018.html |
| 4 |
|
| 5 |
Re-engineered the upstream patch, which was only released |
| 6 |
for the unstable lynx2.8.9. Removed the at_sign, and made sure that |
| 7 |
the user id is correctly stripped of all non valid inputs. |
| 8 |
|
| 9 |
--- WWW/Library/Implementation/HTTCP.c_orig 2016-12-01 15:07:39.487753520 +0000 |
| 10 |
+++ WWW/Library/Implementation/HTTCP.c 2016-12-01 15:10:20.291328282 +0000 |
| 11 |
@@ -1792,7 +1792,6 @@ |
| 12 |
int status = 0; |
| 13 |
char *line = NULL; |
| 14 |
char *p1 = NULL; |
| 15 |
- char *at_sign = NULL; |
| 16 |
char *host = NULL; |
| 17 |
|
| 18 |
#ifdef INET6 |
| 19 |
@@ -1814,14 +1813,8 @@ |
| 20 |
* Get node name and optional port number. |
| 21 |
*/ |
| 22 |
p1 = HTParse(url, "", PARSE_HOST); |
| 23 |
- if ((at_sign = StrChr(p1, '@')) != NULL) { |
| 24 |
- /* |
| 25 |
- * If there's an @ then use the stuff after it as a hostname. |
| 26 |
- */ |
| 27 |
- StrAllocCopy(host, (at_sign + 1)); |
| 28 |
- } else { |
| 29 |
StrAllocCopy(host, p1); |
| 30 |
- } |
| 31 |
+ strip_userid(host, FALSE); |
| 32 |
FREE(p1); |
| 33 |
|
| 34 |
HTSprintf0(&line, "%s%s", WWW_FIND_MESSAGE, host); |
| 35 |
--- WWW/Library/Implementation/HTTP.c_orig 2016-12-01 15:13:24.171404704 +0000 |
| 36 |
+++ WWW/Library/Implementation/HTTP.c 2016-12-01 15:19:59.699276204 +0000 |
| 37 |
@@ -426,7 +426,7 @@ |
| 38 |
/* |
| 39 |
* Strip any username from the given string so we retain only the host. |
| 40 |
*/ |
| 41 |
-static void strip_userid(char *host) |
| 42 |
+void strip_userid(char *host, int parse_only) |
| 43 |
{ |
| 44 |
char *p1 = host; |
| 45 |
char *p2 = StrChr(host, '@'); |
| 46 |
@@ -439,7 +439,8 @@ |
| 47 |
|
| 48 |
CTRACE((tfp, "parsed:%s\n", fake)); |
| 49 |
HTSprintf0(&msg, gettext("Address contains a username: %s"), host); |
| 50 |
- HTAlert(msg); |
| 51 |
+ if (msg !=0 && !parse_only) |
| 52 |
+ HTAlert(msg); |
| 53 |
FREE(msg); |
| 54 |
} |
| 55 |
while ((*p1++ = *p2++) != '\0') { |
| 56 |
@@ -1081,7 +1082,7 @@ |
| 57 |
char *host = NULL; |
| 58 |
|
| 59 |
if ((host = HTParse(anAnchor->address, "", PARSE_HOST)) != NULL) { |
| 60 |
- strip_userid(host); |
| 61 |
+ strip_userid(host, TRUE); |
| 62 |
HTBprintf(&command, "Host: %s%c%c", host, CR, LF); |
| 63 |
FREE(host); |
| 64 |
} |
| 65 |
--- WWW/Library/Implementation/HTUtils.h_orig 2016-12-01 15:21:38.919699987 +0000 |
| 66 |
+++ WWW/Library/Implementation/HTUtils.h 2016-12-01 15:22:57.870511104 +0000 |
| 67 |
@@ -801,6 +801,8 @@ |
| 68 |
|
| 69 |
extern FILE *TraceFP(void); |
| 70 |
|
| 71 |
+ extern void strip_userid(char *host, int warn); |
| 72 |
+ |
| 73 |
#ifdef USE_SSL |
| 74 |
extern SSL *HTGetSSLHandle(void); |
| 75 |
extern void HTSSLInitPRNG(void); |
| 76 |
--- src/LYUtils.c_orig 2016-12-01 15:25:21.769447171 +0000 |
| 77 |
+++ src/LYUtils.c 2016-12-01 15:28:31.901411555 +0000 |
| 78 |
@@ -4693,6 +4693,7 @@ |
| 79 |
* Do a DNS test on the potential host field as presently trimmed. - FM |
| 80 |
*/ |
| 81 |
StrAllocCopy(host, Str); |
| 82 |
+ strip_userid(host, FALSE); |
| 83 |
HTUnEscape(host); |
| 84 |
if (LYCursesON) { |
| 85 |
StrAllocCopy(MsgStr, WWW_FIND_MESSAGE); |