Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sbin/ping6 sync with latest kame.



details:   https://anonhg.NetBSD.org/src/rev/287b781db018
branches:  trunk
changeset: 499929:287b781db018
user:      itojun <itojun%NetBSD.org@localhost>
date:      Sat Dec 02 02:54:21 2000 +0000

description:
sync with latest kame.
- validate strdup() error on argument parsing.
- use strlcat on complex string manipulation.

diffstat:

 sbin/ping6/ping6.c |  50 ++++++++++++++++++++++++--------------------------
 1 files changed, 24 insertions(+), 26 deletions(-)

diffs (133 lines):

diff -r 645ca66480e2 -r 287b781db018 sbin/ping6/ping6.c
--- a/sbin/ping6/ping6.c        Sat Dec 02 02:15:34 2000 +0000
+++ b/sbin/ping6/ping6.c        Sat Dec 02 02:54:21 2000 +0000
@@ -1,5 +1,5 @@
-/*     $NetBSD: ping6.c,v 1.24 2000/11/11 00:46:36 itojun Exp $        */
-/*     $KAME: ping6.c,v 1.99 2000/11/08 09:55:45 itojun Exp $  */
+/*     $NetBSD: ping6.c,v 1.25 2000/12/02 02:54:21 itojun Exp $        */
+/*     $KAME: ping6.c,v 1.105 2000/12/02 02:48:41 itojun Exp $ */
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -81,7 +81,7 @@
 #else
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: ping6.c,v 1.24 2000/11/11 00:46:36 itojun Exp $");
+__RCSID("$NetBSD: ping6.c,v 1.25 2000/12/02 02:54:21 itojun Exp $");
 #endif
 #endif
 
@@ -491,11 +491,13 @@
 #ifdef IPSEC_POLICY_IPSEC
                case 'P':
                        options |= F_POLICY;
-                       if (!strncmp("in", optarg, 2))
-                               policy_in = strdup(optarg);
-                       else if (!strncmp("out", optarg, 3))
-                               policy_out = strdup(optarg);
-                       else
+                       if (!strncmp("in", optarg, 2)) {
+                               if ((policy_in = strdup(optarg)) == NULL)
+                                       errx(1, "strdup");
+                       } else if (!strncmp("out", optarg, 3)) {
+                               if ((policy_out = strdup(optarg)) == NULL)
+                                       errx(1, "strdup");
+                       } else
                                errx(1, "invalid security policy");
                        break;
 #else
@@ -1160,25 +1162,21 @@
        u_char *buf;
        size_t bufsiz;
 {
-       int i, l;
+       int i;
        const u_char *cp;
-       char *q;
-       const char *eq;
        char cresult[MAXDNAME + 1];
        const u_char *comp;
 
        cp = *sp;
-       q = buf;
-       eq = buf + bufsiz;
+       *buf = '\0';
 
        if (cp >= ep)
                return NULL;
        while (cp < ep) {
                i = *cp;
                if (i == 0 || cp != *sp) {
-                       if (q >= eq - 1)
+                       if (strlcat(buf, ".", bufsiz) >= bufsiz)
                                return NULL;    /*result overrun*/
-                       *q++ = '.';
                }
                if (i == 0)
                        break;
@@ -1193,31 +1191,25 @@
                        if (dnsdecode(&comp, cp, base, cresult,
                            sizeof(cresult)) == NULL)
                                return NULL;
-                       if (eq - q < strlen(cresult) + 1)
+                       if (strlcat(buf, cresult, bufsiz) >= bufsiz)
                                return NULL;    /*result overrun*/
-                       strcpy(q, cresult);     /*XXX should be strlcpy*/
-                       q += strlen(q);
                        break;
                } else if ((i & 0x3f) == i) {
                        if (i > ep - cp)
                                return NULL;    /*source overrun*/
                        while (i-- > 0 && cp < ep) {
-                               if (eq - q < (isprint(*cp) ? 2 : 5))
+                               (void)snprintf(cresult, sizeof(cresult),
+                                   isprint(*cp) ? "%c" : "\\%03o", *cp & 0xff);
+                               if (strlcat(buf, cresult, bufsiz) >= bufsiz)
                                        return NULL;    /*result overrun*/
-                               l = snprintf(q, eq - q,
-                                   isprint(*cp) ? "%c" : "\\%03o", *cp & 0xff);
                                cp++;
-                               q += l;
                        }
                } else
                        return NULL;    /*invalid label*/
        }
-       if (q >= eq)
-               return NULL;    /*result overrun*/
        if (i != 0)
                return NULL;    /*not terminated*/
        cp++;
-       *q = '\0';
        *sp = cp;
        return buf;
 }
@@ -1809,6 +1801,9 @@
 
        for (cm = (struct cmsghdr *)CMSG_FIRSTHDR(mhdr); cm;
             cm = (struct cmsghdr *)CMSG_NXTHDR(mhdr, cm)) {
+               if (cm->cmsg_len == 0)
+                       return(-1);
+
                if (cm->cmsg_level == IPPROTO_IPV6 &&
                    cm->cmsg_type == IPV6_HOPLIMIT &&
                    cm->cmsg_len == CMSG_LEN(sizeof(int)))
@@ -1826,6 +1821,9 @@
 
        for (cm = (struct cmsghdr *)CMSG_FIRSTHDR(mhdr); cm;
             cm = (struct cmsghdr *)CMSG_NXTHDR(mhdr, cm)) {
+               if (cm->cmsg_len == 0)
+                       return(NULL);
+
                if (cm->cmsg_level == IPPROTO_IPV6 &&
                    cm->cmsg_type == IPV6_PKTINFO &&
                    cm->cmsg_len == CMSG_LEN(sizeof(struct in6_pktinfo)))
@@ -2057,7 +2055,7 @@
                if (!inet_ntop(AF_INET6, &red->nd_rd_target, ntop_buf,
                    sizeof(ntop_buf)))
                        strncpy(ntop_buf, "?", sizeof(ntop_buf));
-               (void)printf("New Target: %s", ntop_buf);
+               (void)printf(" New Target: %s", ntop_buf);
                break;
        case ICMP6_NI_QUERY:
                (void)printf("Node Information Query");



Home | Main Index | Thread Index | Old Index