diff options
Diffstat (limited to 'src/lib/libc/net/inet_neta.c')
-rw-r--r-- | src/lib/libc/net/inet_neta.c | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/src/lib/libc/net/inet_neta.c b/src/lib/libc/net/inet_neta.c index 881a328ab0..6960bcd0b5 100644 --- a/src/lib/libc/net/inet_neta.c +++ b/src/lib/libc/net/inet_neta.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: inet_neta.c,v 1.3 2002/05/24 21:22:37 deraadt Exp $ */ | 1 | /* $OpenBSD: inet_neta.c,v 1.4 2002/08/19 03:01:54 itojun Exp $ */ |
2 | 2 | ||
3 | /* | 3 | /* |
4 | * Copyright (c) 1996 by Internet Software Consortium. | 4 | * Copyright (c) 1996 by Internet Software Consortium. |
@@ -19,9 +19,9 @@ | |||
19 | 19 | ||
20 | #if defined(LIBC_SCCS) && !defined(lint) | 20 | #if defined(LIBC_SCCS) && !defined(lint) |
21 | #if 0 | 21 | #if 0 |
22 | static const char rcsid[] = "$Id: inet_neta.c,v 1.3 2002/05/24 21:22:37 deraadt Exp $"; | 22 | static const char rcsid[] = "$Id: inet_neta.c,v 1.4 2002/08/19 03:01:54 itojun Exp $"; |
23 | #else | 23 | #else |
24 | static const char rcsid[] = "$OpenBSD: inet_neta.c,v 1.3 2002/05/24 21:22:37 deraadt Exp $"; | 24 | static const char rcsid[] = "$OpenBSD: inet_neta.c,v 1.4 2002/08/19 03:01:54 itojun Exp $"; |
25 | #endif | 25 | #endif |
26 | #endif | 26 | #endif |
27 | 27 | ||
@@ -52,29 +52,37 @@ inet_neta(src, dst, size) | |||
52 | size_t size; | 52 | size_t size; |
53 | { | 53 | { |
54 | char *odst = dst; | 54 | char *odst = dst; |
55 | char *tp; | 55 | char *ep; |
56 | int advance; | ||
56 | 57 | ||
58 | if (src == 0x00000000) { | ||
59 | if (size < sizeof "0.0.0.0") | ||
60 | goto emsgsize; | ||
61 | strlcpy(dst, "0.0.0.0", size); | ||
62 | return dst; | ||
63 | } | ||
64 | ep = dst + size; | ||
65 | if (ep <= dst) | ||
66 | goto emsgsize; | ||
57 | while (src & 0xffffffff) { | 67 | while (src & 0xffffffff) { |
58 | u_char b = (src & 0xff000000) >> 24; | 68 | u_char b = (src & 0xff000000) >> 24; |
59 | 69 | ||
60 | src <<= 8; | 70 | src <<= 8; |
61 | if (b) { | 71 | if (b || src) { |
62 | if (size < sizeof "255.") | 72 | if (ep - dst < sizeof "255.") |
73 | goto emsgsize; | ||
74 | advance = snprintf(dst, ep - dst, "%u", b); | ||
75 | if (advance <= 0 || advance >= ep - dst) | ||
63 | goto emsgsize; | 76 | goto emsgsize; |
64 | tp = dst; | 77 | dst += advance; |
65 | dst += sprintf(dst, "%u", b); | ||
66 | if (src != 0L) { | 78 | if (src != 0L) { |
79 | if (dst + 1 >= ep) | ||
80 | goto emsgsize; | ||
67 | *dst++ = '.'; | 81 | *dst++ = '.'; |
68 | *dst = '\0'; | 82 | *dst = '\0'; |
69 | } | 83 | } |
70 | size -= (size_t)(dst - tp); | ||
71 | } | 84 | } |
72 | } | 85 | } |
73 | if (dst == odst) { | ||
74 | if (size < sizeof "0.0.0.0") | ||
75 | goto emsgsize; | ||
76 | strlcpy(dst, "0.0.0.0", size); | ||
77 | } | ||
78 | return (odst); | 86 | return (odst); |
79 | 87 | ||
80 | emsgsize: | 88 | emsgsize: |