diff options
author | millert <> | 2016-12-08 03:20:50 +0000 |
---|---|---|
committer | millert <> | 2016-12-08 03:20:50 +0000 |
commit | 3ecba1647a8d554781f8b0e23e26568b73b993bb (patch) | |
tree | d292488c6aa1dbd79968461ebe6362b6d2e51095 | |
parent | 1060e3c3f05a22f3224c168f01498400c6e08259 (diff) | |
download | openbsd-3ecba1647a8d554781f8b0e23e26568b73b993bb.tar.gz openbsd-3ecba1647a8d554781f8b0e23e26568b73b993bb.tar.bz2 openbsd-3ecba1647a8d554781f8b0e23e26568b73b993bb.zip |
Fix regressions introduce in the fix for CVE-2016-6559.
From FreeBSD (glebius)
-rw-r--r-- | src/lib/libc/net/linkaddr.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/src/lib/libc/net/linkaddr.c b/src/lib/libc/net/linkaddr.c index 354067b3b5..9101e23a86 100644 --- a/src/lib/libc/net/linkaddr.c +++ b/src/lib/libc/net/linkaddr.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: linkaddr.c,v 1.8 2016/12/07 01:05:47 millert Exp $ */ | 1 | /* $OpenBSD: linkaddr.c,v 1.9 2016/12/08 03:20:50 millert Exp $ */ |
2 | /*- | 2 | /*- |
3 | * Copyright (c) 1990, 1993 | 3 | * Copyright (c) 1990, 1993 |
4 | * The Regents of the University of California. All rights reserved. | 4 | * The Regents of the University of California. All rights reserved. |
@@ -41,7 +41,7 @@ link_ntoa(const struct sockaddr_dl *sdl) | |||
41 | { | 41 | { |
42 | static char obuf[64]; | 42 | static char obuf[64]; |
43 | char *out; | 43 | char *out; |
44 | const char *in, *inlim; | 44 | const u_char *in, *inlim; |
45 | int namelen, i, rem; | 45 | int namelen, i, rem; |
46 | 46 | ||
47 | namelen = (sdl->sdl_nlen <= IFNAMSIZ) ? sdl->sdl_nlen : IFNAMSIZ; | 47 | namelen = (sdl->sdl_nlen <= IFNAMSIZ) ? sdl->sdl_nlen : IFNAMSIZ; |
@@ -58,11 +58,11 @@ link_ntoa(const struct sockaddr_dl *sdl) | |||
58 | } | 58 | } |
59 | } | 59 | } |
60 | 60 | ||
61 | in = (const char *)sdl->sdl_data + sdl->sdl_nlen; | 61 | in = (const u_char *)sdl->sdl_data + sdl->sdl_nlen; |
62 | inlim = in + sdl->sdl_alen; | 62 | inlim = in + sdl->sdl_alen; |
63 | 63 | ||
64 | while (in < inlim && rem > 1) { | 64 | while (in < inlim && rem > 1) { |
65 | if (in != (const char *)sdl->sdl_data + sdl->sdl_nlen) { | 65 | if (in != (const u_char *)sdl->sdl_data + sdl->sdl_nlen) { |
66 | *out++ = '.'; | 66 | *out++ = '.'; |
67 | rem--; | 67 | rem--; |
68 | } | 68 | } |
@@ -70,9 +70,8 @@ link_ntoa(const struct sockaddr_dl *sdl) | |||
70 | if (i > 0xf) { | 70 | if (i > 0xf) { |
71 | if (rem < 3) | 71 | if (rem < 3) |
72 | break; | 72 | break; |
73 | *out++ = hexlist[i >> 4]; | ||
73 | *out++ = hexlist[i & 0xf]; | 74 | *out++ = hexlist[i & 0xf]; |
74 | i >>= 4; | ||
75 | *out++ = hexlist[i]; | ||
76 | rem -= 2; | 75 | rem -= 2; |
77 | } else { | 76 | } else { |
78 | if (rem < 2) | 77 | if (rem < 2) |