summaryrefslogtreecommitdiff
path: root/src/lib/libc/net/inet_neta.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libc/net/inet_neta.c')
-rw-r--r--src/lib/libc/net/inet_neta.c36
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
22static const char rcsid[] = "$Id: inet_neta.c,v 1.3 2002/05/24 21:22:37 deraadt Exp $"; 22static const char rcsid[] = "$Id: inet_neta.c,v 1.4 2002/08/19 03:01:54 itojun Exp $";
23#else 23#else
24static const char rcsid[] = "$OpenBSD: inet_neta.c,v 1.3 2002/05/24 21:22:37 deraadt Exp $"; 24static 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: