summaryrefslogtreecommitdiffstats
path: root/source/n/traceroute/traceroute_1.4a12-5.diff
diff options
context:
space:
mode:
Diffstat (limited to 'source/n/traceroute/traceroute_1.4a12-5.diff')
-rw-r--r--source/n/traceroute/traceroute_1.4a12-5.diff1152
1 files changed, 0 insertions, 1152 deletions
diff --git a/source/n/traceroute/traceroute_1.4a12-5.diff b/source/n/traceroute/traceroute_1.4a12-5.diff
deleted file mode 100644
index 8cf3d1fe1..000000000
--- a/source/n/traceroute/traceroute_1.4a12-5.diff
+++ /dev/null
@@ -1,1152 +0,0 @@
---- traceroute-1.4a12.orig/aclocal.m4
-+++ traceroute-1.4a12/aclocal.m4
-@@ -47,7 +47,7 @@
- AC_BEFORE([$0], [AC_LBL_FIXINCLUDES])
- AC_BEFORE([$0], [AC_LBL_DEVEL])
- AC_ARG_WITH(gcc, [ --without-gcc don't use gcc])
-- $1="-O"
-+ $1="-g -O"
- $2=""
- if test "${srcdir}" != "." ; then
- $2="-I\$\(srcdir\)"
-@@ -677,12 +677,11 @@
- AC_TRY_LINK(dnl
- ifelse([$2], [main], , dnl Avoid conflicting decl of main.
- [/* Override any gcc2 internal prototype to avoid an error. */
--]ifelse(AC_LANG, CPLUSPLUS, [#ifdef __cplusplus
-+#ifdef __cplusplus
- extern "C"
- #endif
--])dnl
--[/* We use char because int might match the return type of a gcc2
-- builtin and then its argument prototype would still apply. */
-+/* We use char because int might match the return type of a gcc2
-+ builtin and then its argument prototype would still apply. */
- char $2();
- ]),
- [$2()],
---- traceroute-1.4a12.orig/configure.in
-+++ traceroute-1.4a12/configure.in
-@@ -22,7 +22,7 @@
- net/if_dl.h inet/mib2.h)
-
- AC_REPLACE_FUNCS(strerror usleep)
--AC_CHECK_FUNCS(setlinebuf)
-+AC_CHECK_FUNCS(setlinebuf snprintf)
- if test $ac_cv_func_usleep = "no" ; then
- AC_CHECK_FUNCS(nanosleep)
- fi
-@@ -44,8 +44,9 @@
- ;;
-
- linux*)
-- V_INCLS="$V_INCLS -Ilinux-include"
-+ V_INCLS="$V_INCLS -Ilinux-include -DUSE_KERNEL_ROUTING_TABLE"
- AC_DEFINE(BYTESWAP_IP_HDR)
-+ AC_DEFINE(HAVE_RAW_OPTIONS)
- ;;
-
- osf3*)
---- traceroute-1.4a12.orig/findsaddr-generic.c
-+++ traceroute-1.4a12/findsaddr-generic.c
-@@ -82,7 +82,11 @@
- static char errbuf[132];
-
- /* Get the interface address list */
-+#if HAVE_SNPRINTF
-+ if ((n = ifaddrlist(&al, errbuf, sizeof(errbuf))) < 0)
-+#else
- if ((n = ifaddrlist(&al, errbuf)) < 0)
-+#endif
- return (errbuf);
-
- if (n == 0)
---- traceroute-1.4a12.orig/findsaddr-linux.c
-+++ traceroute-1.4a12/findsaddr-linux.c
-@@ -90,7 +90,11 @@
- static char errbuf[132];
-
- if ((f = fopen(route, "r")) == NULL) {
-+#if HAVE_SNPRINTF
-+ snprintf(errbuf, sizeof(errbuf), "open %s: %.128s", route, strerror(errno));
-+#else
- sprintf(errbuf, "open %s: %.128s", route, strerror(errno));
-+#endif
- return (errbuf);
- }
-
-@@ -102,7 +106,7 @@
- ++n;
- if (n == 1 && strncmp(buf, "Iface", 5) == 0)
- continue;
-- if ((i = sscanf(buf, "%s %x %*s %*s %*s %*s %*s %x",
-+ if ((i = sscanf(buf, "%255s %x %*s %*s %*s %*s %*s %x",
- tdevice, &dest, &tmask)) != 3)
- return ("junk in buffer");
- if ((to->sin_addr.s_addr & tmask) == dest &&
-@@ -117,7 +121,11 @@
- return ("Can't find interface");
-
- /* Get the interface address list */
-+#if HAVE_SNPRINTF
-+ if ((n = ifaddrlist(&al, errbuf, sizeof(errbuf))) < 0)
-+#else
- if ((n = ifaddrlist(&al, errbuf)) < 0)
-+#endif
- return (errbuf);
-
- if (n == 0)
-@@ -128,7 +136,11 @@
- if (strcmp(device, al->device) == 0)
- break;
- if (i <= 0) {
-+#if HAVE_SNPRINTF
-+ snprintf(errbuf, sizeof(errbuf), "Can't find interface \"%.32s\"", device);
-+#else
- sprintf(errbuf, "Can't find interface \"%.32s\"", device);
-+#endif
- return (errbuf);
- }
-
---- traceroute-1.4a12.orig/findsaddr-socket.c
-+++ traceroute-1.4a12/findsaddr-socket.c
-@@ -114,7 +114,11 @@
-
- s = socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC);
- if (s < 0) {
-+#if HAVE_SNPRINTF
-+ snprintf(errbuf, sizeof(errbuf), "socket: %.128s", strerror(errno));
-+#else
- sprintf(errbuf, "socket: %.128s", strerror(errno));
-+#endif
- return (errbuf);
- }
-
-@@ -134,12 +138,20 @@
-
- cc = write(s, (char *)rp, size);
- if (cc < 0) {
-+#if HAVE_SNPRINTF
-+ snprintf(errbuf, sizeof(errbuf), "write: %.128s", strerror(errno));
-+#else
- sprintf(errbuf, "write: %.128s", strerror(errno));
-+#endif
- close(s);
- return (errbuf);
- }
- if (cc != size) {
-+#if HAVE_SNPRINTF
-+ snprintf(errbuf, sizeof(errbuf), "short write (%d != %d)", cc, size);
-+#else
- sprintf(errbuf, "short write (%d != %d)", cc, size);
-+#endif
- close(s);
- return (errbuf);
- }
-@@ -149,7 +161,11 @@
- memset(rp, 0, size);
- cc = read(s, (char *)rp, size);
- if (cc < 0) {
-+#if HAVE_SNPRINTF
-+ snprintf(errbuf, sizeof(errbuf), "read: %.128s", strerror(errno));
-+#else
- sprintf(errbuf, "read: %.128s", strerror(errno));
-+#endif
- close(s);
- return (errbuf);
- }
-@@ -159,15 +175,27 @@
-
-
- if (rp->rtm_version != RTM_VERSION) {
-+#if HAVE_SNPRINTF
-+ snprintf(errbuf, sizeof(errbuf), "bad version %d", rp->rtm_version);
-+#else
- sprintf(errbuf, "bad version %d", rp->rtm_version);
-+#endif
- return (errbuf);
- }
- if (rp->rtm_msglen > cc) {
-+#if HAVE_SNPRINTF
-+ snprintf(errbuf, sizeof(errbuf), "bad msglen %d > %d", rp->rtm_msglen, cc);
-+#else
- sprintf(errbuf, "bad msglen %d > %d", rp->rtm_msglen, cc);
-+#endif
- return (errbuf);
- }
- if (rp->rtm_errno != 0) {
-+#if HAVE_SNPRINTF
-+ snprintf(errbuf, sizeof(errbuf), "rtm_errno: %.128s", strerror(rp->rtm_errno));
-+#else
- sprintf(errbuf, "rtm_errno: %.128s", strerror(rp->rtm_errno));
-+#endif
- return (errbuf);
- }
-
---- traceroute-1.4a12.orig/ifaddrlist.c
-+++ traceroute-1.4a12/ifaddrlist.c
-@@ -72,7 +72,12 @@
- * Return the interface list
- */
- int
-+#if HAVE_SNPRINTF
-+ifaddrlist(register struct ifaddrlist **ipaddrp, register char *errbuf,
-+ size_t nerrbuf)
-+#else
- ifaddrlist(register struct ifaddrlist **ipaddrp, register char *errbuf)
-+#endif
- {
- register int fd, nipaddr;
- #ifdef HAVE_SOCKADDR_SA_LEN
-@@ -89,7 +94,11 @@
-
- fd = socket(AF_INET, SOCK_DGRAM, 0);
- if (fd < 0) {
-+#if HAVE_SNPRINTF
-+ (void)snprintf(errbuf, nerrbuf, "socket: %s", strerror(errno));
-+#else
- (void)sprintf(errbuf, "socket: %s", strerror(errno));
-+#endif
- return (-1);
- }
- ifc.ifc_len = sizeof(ibuf);
-@@ -98,12 +107,23 @@
- if (ioctl(fd, SIOCGIFCONF, (char *)&ifc) < 0 ||
- ifc.ifc_len < sizeof(struct ifreq)) {
- if (errno == EINVAL)
-+#if HAVE_SNPRINTF
-+ (void)snprintf(errbuf, nerrbuf,
-+ "SIOCGIFCONF: ifreq struct too small (%d bytes)",
-+ sizeof(ibuf));
-+#else
- (void)sprintf(errbuf,
- "SIOCGIFCONF: ifreq struct too small (%d bytes)",
- sizeof(ibuf));
-+#endif
- else
-+#if HAVE_SNPRINTF
-+ (void)snprintf(errbuf, nerrbuf, "SIOCGIFCONF: %s",
-+ strerror(errno));
-+#else
- (void)sprintf(errbuf, "SIOCGIFCONF: %s",
- strerror(errno));
-+#endif
- (void)close(fd);
- return (-1);
- }
-@@ -135,9 +155,15 @@
- if (ioctl(fd, SIOCGIFFLAGS, (char *)&ifr) < 0) {
- if (errno == ENXIO)
- continue;
-+#if HAVE_SNPRINTF
-+ (void)snprintf(errbuf, nerrbuf, "SIOCGIFFLAGS: %.*s: %s",
-+ (int)sizeof(ifr.ifr_name), ifr.ifr_name,
-+ strerror(errno));
-+#else
- (void)sprintf(errbuf, "SIOCGIFFLAGS: %.*s: %s",
- (int)sizeof(ifr.ifr_name), ifr.ifr_name,
- strerror(errno));
-+#endif
- (void)close(fd);
- return (-1);
- }
-@@ -155,21 +181,35 @@
- continue;
- #endif
- if (ioctl(fd, SIOCGIFADDR, (char *)&ifr) < 0) {
-+#if HAVE_SNPRINTF
-+ (void)snprintf(errbuf, nerrbuf, "SIOCGIFADDR: %s: %s",
-+ device, strerror(errno));
-+#else
- (void)sprintf(errbuf, "SIOCGIFADDR: %s: %s",
- device, strerror(errno));
-+#endif
- (void)close(fd);
- return (-1);
- }
-
- if (nipaddr >= MAX_IPADDR) {
-+#if HAVE_SNPRINTF
-+ (void)snprintf(errbuf, nerrbuf, "Too many interfaces (%d)",
-+ MAX_IPADDR);
-+#else
- (void)sprintf(errbuf, "Too many interfaces (%d)",
- MAX_IPADDR);
-+#endif
- (void)close(fd);
- return (-1);
- }
- sin = (struct sockaddr_in *)&ifr.ifr_addr;
- al->addr = sin->sin_addr.s_addr;
- al->device = strdup(device);
-+ if (al->device == NULL) {
-+ fputs("ifaddrlist: strdup\n", stderr);
-+ exit(1);
-+ }
- ++al;
- ++nipaddr;
- }
---- traceroute-1.4a12.orig/ifaddrlist.h
-+++ traceroute-1.4a12/ifaddrlist.h
-@@ -26,4 +26,8 @@
- char *device;
- };
-
-+#if HAVE_SNPRINTF
-+int ifaddrlist(struct ifaddrlist **, char *, size_t);
-+#else
- int ifaddrlist(struct ifaddrlist **, char *);
-+#endif
---- traceroute-1.4a12.orig/traceroute.8
-+++ traceroute-1.4a12/traceroute.8
-@@ -23,7 +23,7 @@
- .na
- .B traceroute
- [
--.B \-dFInrvx
-+.B \-dFIlnrvx
- ] [
- .B \-f
- .I first_ttl
-@@ -110,6 +110,10 @@
- .B \-I
- Use ICMP ECHO instead of UDP datagrams.
- .TP
-+.B \-l
-+Display the ttl value of the returned packet. This is useful for
-+checking for assymetric routing.
-+.TP
- .B \-m
- Set the max time-to-live (max number of hops) used in outgoing probe
- packets. The default is 30 hops (the same default used for TCP
-@@ -146,9 +150,8 @@
- multi-homed hosts (those with more than one IP
- address), this option can be used to
- force the source address to be something other than the IP address
--of the interface the probe packet is sent on. If the IP address
--is not one of this machine's interface addresses, an error is
--returned and nothing is sent. (See the
-+of the interface the probe packet is sent on. This option can only
-+be used by the super-user. (See the
- .B \-i
- flag for another way to do this.)
- .TP
-@@ -329,6 +332,9 @@
- or
- .B !P
- (host, network or protocol unreachable),
-+.BR !A ,
-+.BR !C
-+(access to the network or host, respectively, is prohibited),
- .B !S
- (source route failed),
- .B !F\-<pmtu>
---- traceroute-1.4a12.orig/traceroute.c
-+++ traceroute-1.4a12/traceroute.c
-@@ -271,7 +271,7 @@
- struct outdata {
- u_char seq; /* sequence number of this packet */
- u_char ttl; /* ttl packet left with */
-- struct timeval tv; /* time packet left */
-+ struct timeval tv __attribute__((packed)); /* time packet left */
- };
-
- #ifndef HAVE_ICMP_NEXTMTU
-@@ -296,8 +296,8 @@
- int s; /* receive (icmp) socket file descriptor */
- int sndsock; /* send (udp/icmp) socket file descriptor */
-
--struct sockaddr whereto; /* Who to try to reach */
--struct sockaddr wherefrom; /* Who we are */
-+struct sockaddr_storage whereto; /* Who to try to reach */
-+struct sockaddr_storage wherefrom; /* Who we are */
- int packlen; /* total length of packet */
- int minpacket; /* min ip packet size */
- int maxpacket = 32 * 1024; /* max ip packet size */
-@@ -352,6 +352,11 @@
- int usleep(u_int);
- #endif
-
-+#ifdef USE_KERNEL_ROUTING_TABLE
-+struct ifaddrlist *search_routing_table(struct sockaddr_in *to, struct ifaddrlist *al, int n);
-+#endif
-+
-+
- int
- main(int argc, char **argv)
- {
-@@ -370,8 +375,12 @@
- int tos = 0, settos = 0;
- register int lsrr = 0;
- register u_short off = 0;
-- struct ifaddrlist *al;
-+ struct ifaddrlist *al, *allist;
- char errbuf[132];
-+ int ttl_flag = 0;
-+ int uid;
-+
-+ uid = getuid();
-
- if (argv[0] == NULL)
- prog = "traceroute";
-@@ -381,7 +390,7 @@
- prog = argv[0];
-
- opterr = 0;
-- while ((op = getopt(argc, argv, "dFInrvxf:g:i:m:p:q:s:t:w:z:")) != EOF)
-+ while ((op = getopt(argc, argv, "dFIlnrvxf:g:i:m:p:q:s:t:w:z:")) != EOF)
- switch (op) {
-
- case 'd':
-@@ -397,6 +406,10 @@
- break;
-
- case 'g':
-+ if (strlen(optarg) >= MAXHOSTNAMELEN) {
-+ Fprintf(stderr, "%s: Nice Try !\n", prog);
-+ exit(-1);
-+ }
- if (lsrr >= NGATEWAYS) {
- Fprintf(stderr,
- "%s: No more than %d gateways\n",
-@@ -409,12 +422,21 @@
-
- case 'i':
- device = optarg;
-+ if (strlen(device) >= 16) { /* that is the IFNAMSIZ
-+ * from kernel headers */
-+ Fprintf(stderr, "%s: Nice try !\n", prog);
-+ exit(-1);
-+ }
- break;
-
- case 'I':
- ++useicmp;
- break;
-
-+ case 'l':
-+ ++ttl_flag;
-+ break;
-+
- case 'm':
- max_ttl = str2val(optarg, "max ttl", 1, 255);
- break;
-@@ -441,7 +463,19 @@
- * set the ip source address of the outbound
- * probe (e.g., on a multi-homed host).
- */
-+ if (uid) {
-+ Fprintf(
-+ stderr,
-+ "%s: -s %s: Permission denied\n",
-+ prog, optarg
-+ );
-+ exit(-1);
-+ }
- source = optarg;
-+ if (strlen(source) >= MAXHOSTNAMELEN) {
-+ Fprintf(stderr, "%s: Nice Try !\n", prog);
-+ exit(-1);
-+ }
- break;
-
- case 't':
-@@ -500,6 +534,10 @@
-
- case 1:
- hostname = argv[optind];
-+ if (strlen(hostname) >= MAXHOSTNAMELEN) {
-+ Fprintf(stderr, "%s: Nice try !\n", prog);
-+ exit(-1);
-+ }
- hi = gethostinfo(hostname);
- setsin(to, hi->addrs[0]);
- if (hi->n > 1)
-@@ -515,75 +553,6 @@
- usage();
- }
-
--#ifdef HAVE_SETLINEBUF
-- setlinebuf (stdout);
--#else
-- setvbuf(stdout, NULL, _IOLBF, 0);
--#endif
--
-- outip = (struct ip *)malloc((unsigned)packlen);
-- if (outip == NULL) {
-- Fprintf(stderr, "%s: malloc: %s\n", prog, strerror(errno));
-- exit(1);
-- }
-- memset((char *)outip, 0, packlen);
--
-- outip->ip_v = IPVERSION;
-- if (settos)
-- outip->ip_tos = tos;
--#ifdef BYTESWAP_IP_HDR
-- outip->ip_len = htons(packlen);
-- outip->ip_off = htons(off);
--#else
-- outip->ip_len = packlen;
-- outip->ip_off = off;
--#endif
-- outp = (u_char *)(outip + 1);
--#ifdef HAVE_RAW_OPTIONS
-- if (lsrr > 0) {
-- register u_char *optlist;
--
-- optlist = outp;
-- outp += optlen;
--
-- /* final hop */
-- gwlist[lsrr] = to->sin_addr.s_addr;
--
-- outip->ip_dst.s_addr = gwlist[0];
--
-- /* force 4 byte alignment */
-- optlist[0] = IPOPT_NOP;
-- /* loose source route option */
-- optlist[1] = IPOPT_LSRR;
-- i = lsrr * sizeof(gwlist[0]);
-- optlist[2] = i + 3;
-- /* Pointer to LSRR addresses */
-- optlist[3] = IPOPT_MINOFF;
-- memcpy(optlist + 4, gwlist + 1, i);
-- } else
--#endif
-- outip->ip_dst = to->sin_addr;
--
-- outip->ip_hl = (outp - (u_char *)outip) >> 2;
-- ident = (getpid() & 0xffff) | 0x8000;
-- if (useicmp) {
-- outip->ip_p = IPPROTO_ICMP;
--
-- outicmp = (struct icmp *)outp;
-- outicmp->icmp_type = ICMP_ECHO;
-- outicmp->icmp_id = htons(ident);
--
-- outdata = (struct outdata *)(outp + 8); /* XXX magic number */
-- } else {
-- outip->ip_p = IPPROTO_UDP;
--
-- outudp = (struct udphdr *)outp;
-- outudp->uh_sport = htons(ident);
-- outudp->uh_ulen =
-- htons((u_short)(packlen - (sizeof(*outip) + optlen)));
-- outdata = (struct outdata *)(outudp + 1);
-- }
--
- cp = "icmp";
- if ((pe = getprotobyname(cp)) == NULL) {
- Fprintf(stderr, "%s: unknown protocol %s\n", prog, cp);
-@@ -591,12 +560,15 @@
- }
-
- /* Insure the socket fds won't be 0, 1 or 2 */
-- if (open(devnull, O_RDONLY) < 0 ||
-- open(devnull, O_RDONLY) < 0 ||
-- open(devnull, O_RDONLY) < 0) {
-- Fprintf(stderr, "%s: open \"%s\": %s\n",
-- prog, devnull, strerror(errno));
-- exit(1);
-+ do {
-+ if ((n = open(devnull, O_RDONLY)) < 0) {
-+ Fprintf(stderr, "%s: open \"%s\": %s\n",
-+ prog, devnull, strerror(errno));
-+ exit(1);
-+ }
-+ } while (n < 2);
-+ if (n > 2) {
-+ close(n);
- }
- if ((s = socket(AF_INET, SOCK_RAW, pe->p_proto)) < 0) {
- Fprintf(stderr, "%s: icmp socket: %s\n", prog, strerror(errno));
-@@ -662,7 +634,7 @@
- #endif
- #ifdef IP_HDRINCL
- if (setsockopt(sndsock, IPPROTO_IP, IP_HDRINCL, (char *)&on,
-- sizeof(on)) < 0) {
-+ sizeof(on)) < 0 && errno != ENOPROTOOPT) {
- Fprintf(stderr, "%s: IP_HDRINCL: %s\n", prog, strerror(errno));
- exit(1);
- }
-@@ -683,8 +655,88 @@
- (void)setsockopt(sndsock, SOL_SOCKET, SO_DONTROUTE, (char *)&on,
- sizeof(on));
-
-+ /* Revert to non-privileged user after opening sockets */
-+ setgid(getgid());
-+ setuid(uid);
-+
-+#ifndef __GLIBC__
-+#ifdef HAVE_SETLINEBUF
-+ setlinebuf (stdout);
-+#else
-+ setvbuf(stdout, NULL, _IOLBF, 0);
-+#endif
-+#endif
-+
-+ outip = (struct ip *)malloc((unsigned)packlen);
-+ if (outip == NULL) {
-+ Fprintf(stderr, "%s: malloc: %s\n", prog, strerror(errno));
-+ exit(1);
-+ }
-+ memset((char *)outip, 0, packlen);
-+
-+ outip->ip_v = IPVERSION;
-+ if (settos)
-+ outip->ip_tos = tos;
-+#ifdef BYTESWAP_IP_HDR
-+ outip->ip_len = htons(packlen);
-+ outip->ip_off = htons(off);
-+#else
-+ outip->ip_len = packlen;
-+ outip->ip_off = off;
-+#endif
-+ outp = (u_char *)(outip + 1);
-+#ifdef HAVE_RAW_OPTIONS
-+ if (lsrr > 0) {
-+ register u_char *optlist;
-+
-+ optlist = outp;
-+ outp += optlen;
-+
-+ /* final hop */
-+ gwlist[lsrr] = to->sin_addr.s_addr;
-+
-+ outip->ip_dst.s_addr = gwlist[0];
-+
-+ /* force 4 byte alignment */
-+ optlist[0] = IPOPT_NOP;
-+ /* loose source route option */
-+ optlist[1] = IPOPT_LSRR;
-+ i = lsrr * sizeof(gwlist[0]);
-+ optlist[2] = i + 3;
-+ /* Pointer to LSRR addresses */
-+ optlist[3] = IPOPT_MINOFF;
-+ memcpy(optlist + 4, gwlist + 1, i);
-+ } else
-+#endif
-+ outip->ip_dst = to->sin_addr;
-+
-+ outip->ip_hl = (outp - (u_char *)outip) >> 2;
-+ ident = (getpid() & 0xffff) | 0x8000;
-+ if (useicmp) {
-+ outip->ip_p = IPPROTO_ICMP;
-+
-+ outicmp = (struct icmp *)outp;
-+ outicmp->icmp_type = ICMP_ECHO;
-+ outicmp->icmp_id = htons(ident);
-+
-+ outdata = (struct outdata *)(outp + 8); /* XXX magic number */
-+ } else {
-+ outip->ip_p = IPPROTO_UDP;
-+
-+ outudp = (struct udphdr *)outp;
-+ outudp->uh_sport = htons(ident);
-+ outudp->uh_ulen =
-+ htons((u_short)(packlen - (sizeof(*outip) + optlen)));
-+ outdata = (struct outdata *)(outudp + 1);
-+ }
-+
- /* Get the interface address list */
-- n = ifaddrlist(&al, errbuf);
-+#if HAVE_SNPRINTF
-+ n = ifaddrlist(&allist, errbuf, sizeof(errbuf));
-+#else
-+ n = ifaddrlist(&allist, errbuf);
-+#endif
-+ al = allist;
- if (n < 0) {
- Fprintf(stderr, "%s: ifaddrlist: %s\n", prog, errbuf);
- exit(1);
-@@ -709,6 +761,15 @@
-
- /* Determine our source address */
- if (source == NULL) {
-+#ifdef USE_KERNEL_ROUTING_TABLE
-+ /* Search the kernel routing table for a match with the
-+ * destination address. Then use that interface. If
-+ * there is no match, default to using the first
-+ * interface found.
-+ */
-+ al = search_routing_table(to, allist, n);
-+ setsin(from, al->addr);
-+#else
- /*
- * If a device was specified, use the interface address.
- * Otherwise, try to determine our source address.
-@@ -720,6 +781,7 @@
- prog, err);
- exit(1);
- }
-+#endif
- } else {
- hi = gethostinfo(source);
- source = hi->name;
-@@ -751,10 +813,6 @@
- freehostinfo(hi);
- }
-
-- /* Revert to non-privileged user after opening sockets */
-- setgid(getgid());
-- setuid(getuid());
--
- outip->ip_src = from->sin_addr;
- #ifndef IP_HDRINCL
- if (bind(sndsock, (struct sockaddr *)from, sizeof(*from)) < 0) {
-@@ -803,9 +861,11 @@
- ++gotlastaddr;
- }
- Printf(" %.3f ms", deltaT(&t1, &t2));
-+ ip = (struct ip *)packet;
-+ if (ttl_flag)
-+ Printf(" (%d)", ip->ip_ttl);
- if (i == -2) {
- #ifndef ARCHAIC
-- ip = (struct ip *)packet;
- if (ip->ip_ttl <= 1)
- Printf(" !");
- #endif
-@@ -820,7 +880,6 @@
-
- case ICMP_UNREACH_PORT:
- #ifndef ARCHAIC
-- ip = (struct ip *)packet;
- if (ip->ip_ttl <= 1)
- Printf(" !");
- #endif
-@@ -853,8 +912,14 @@
- break;
-
- case ICMP_UNREACH_FILTER_PROHIB:
-+ case ICMP_UNREACH_NET_PROHIB: /* misuse */
-+ ++unreachable;
-+ Printf(" !A");
-+ break;
-+
-+ case ICMP_UNREACH_HOST_PROHIB:
- ++unreachable;
-- Printf(" !X");
-+ Printf(" !C");
- break;
-
- case ICMP_UNREACH_HOST_PRECEDENCE:
-@@ -867,6 +932,23 @@
- Printf(" !C");
- break;
-
-+ case ICMP_UNREACH_NET_UNKNOWN:
-+ case ICMP_UNREACH_HOST_UNKNOWN:
-+ ++unreachable;
-+ Printf(" !U");
-+ break;
-+
-+ case ICMP_UNREACH_ISOLATED:
-+ ++unreachable;
-+ Printf(" !I");
-+ break;
-+
-+ case ICMP_UNREACH_TOSNET:
-+ case ICMP_UNREACH_TOSHOST:
-+ ++unreachable;
-+ Printf(" !T");
-+ break;
-+
- default:
- ++unreachable;
- Printf(" !<%d>", code);
-@@ -894,7 +976,7 @@
- struct timeval now, wait;
- struct timezone tz;
- register int cc = 0;
-- int fromlen = sizeof(*fromp);
-+ socklen_t fromlen = sizeof(*fromp);
-
- FD_ZERO(&fds);
- FD_SET(sock, &fds);
-@@ -938,7 +1020,7 @@
- /* Payload */
- outdata->seq = seq;
- outdata->ttl = ttl;
-- outdata->tv = *tp;
-+ memcpy(&outdata->tv, tp, sizeof(outdata->tv));
-
- if (useicmp)
- outicmp->icmp_seq = htons(seq);
-@@ -1003,12 +1085,13 @@
-
- #ifdef __hpux
- cc = sendto(sndsock, useicmp ? (char *)outicmp : (char *)outudp,
-- packlen - (sizeof(*outip) + optlen), 0, &whereto, sizeof(whereto));
-+ packlen - (sizeof(*outip) + optlen), 0,
-+ (struct sockaddr *)&whereto, sizeof(whereto));
- if (cc > 0)
- cc += sizeof(*outip) + optlen;
- #else
- cc = sendto(sndsock, (char *)outip,
-- packlen, 0, &whereto, sizeof(whereto));
-+ packlen, 0, (struct sockaddr *)&whereto, sizeof(whereto));
- #endif
- if (cc < 0 || cc != packlen) {
- if (cc < 0)
-@@ -1039,12 +1122,12 @@
- static char *ttab[] = {
- "Echo Reply", "ICMP 1", "ICMP 2", "Dest Unreachable",
- "Source Quench", "Redirect", "ICMP 6", "ICMP 7",
-- "Echo", "ICMP 9", "ICMP 10", "Time Exceeded",
-+ "Echo", "Router Advert", "Router Solicit", "Time Exceeded",
- "Param Problem", "Timestamp", "Timestamp Reply", "Info Request",
-- "Info Reply"
-+ "Info Reply", "Mask Request", "Mask Reply"
- };
-
-- if (t > 16)
-+ if (t > 18)
- return("OUT-OF-RANGE");
-
- return(ttab[t]);
-@@ -1272,6 +1355,11 @@
- addr = inet_addr(hostname);
- if ((int32_t)addr != -1) {
- hi->name = strdup(hostname);
-+ if (hi->name == NULL) {
-+ Fprintf(stderr, "%s: strdup %s\n",
-+ prog, strerror(errno));
-+ exit(1);
-+ }
- hi->n = 1;
- hi->addrs = calloc(1, sizeof(hi->addrs[0]));
- if (hi->addrs == NULL) {
-@@ -1293,6 +1381,11 @@
- exit(1);
- }
- hi->name = strdup(hp->h_name);
-+ if (hi->name == NULL) {
-+ Fprintf(stderr, "%s: strdup %s\n",
-+ prog, strerror(errno));
-+ exit(1);
-+ }
- for (n = 0, p = hp->h_addr_list; *p != NULL; ++n, ++p)
- continue;
- hi->n = n;
-@@ -1381,8 +1474,96 @@
-
- Fprintf(stderr, "Version %s\n", version);
- Fprintf(stderr,
-- "Usage: %s [-dFInrvx] [-g gateway] [-i iface] [-f first_ttl]\n"
-+ "Usage: %s [-dFIlnrvx] [-g gateway] [-i iface] [-f first_ttl]\n"
- "\t[-m max_ttl] [ -p port] [-q nqueries] [-s src_addr] [-t tos]\n"
- "\t[-w waittime] [-z pausemsecs] host [packetlen]\n", prog);
- exit(1);
- }
-+
-+
-+#ifdef USE_KERNEL_ROUTING_TABLE
-+
-+/* This function currently only supports IPv4. Someone who knows
-+ * more about multi-protocol socket stuff should take a look at this.
-+ *
-+ * (But does it make any sense for traceroute to support other
-+ * protocols? Maybe IPv6...
-+ */
-+
-+struct ifaddrlist *search_routing_table(struct sockaddr_in *to, struct ifaddrlist *al, int n)
-+{
-+ struct ifaddrlist *first_if;
-+ FILE *fp;
-+ char buf[1024];
-+ char ifname[128];
-+ unsigned int route_dest;
-+ unsigned int mask;
-+ char best_name[128];
-+ unsigned int best_mask;
-+ unsigned int dest_addr;
-+ unsigned int convs;
-+
-+ /* How come using ntohl(to->sin_addr.s_addr) doesn't work here? */
-+ dest_addr = to->sin_addr.s_addr;
-+
-+ fp = fopen("/proc/net/route", "r");
-+ if (fp == NULL) {
-+ return al;
-+ }
-+
-+ /* Skip the first line (the column headings) */
-+ if (fgets(buf, sizeof(buf), fp) == NULL) {
-+ fclose(fp);
-+ return al;
-+ }
-+
-+ best_name[0] = '\0';
-+ best_mask = 0;
-+
-+ while (fgets(buf, sizeof(buf), fp) != NULL) {
-+ /* Field 1: interface name
-+ * Field 2: dest addr
-+ * Field 8: genmask
-+ */
-+ convs = sscanf(buf, "%127s %x %*s %*s %*s %*s %*s %x",
-+ ifname, &route_dest, &mask);
-+ if (convs != 3) {
-+ /* format error .... */
-+ fclose(fp);
-+ return al;
-+ }
-+
-+ if ((dest_addr & mask) == route_dest) {
-+ /* This routing entry applies to
-+ * our destination addr
-+ */
-+ if ((mask > best_mask) || (best_mask == 0)) {
-+ /* And it is more specific than any
-+ * previous match (or is the first match)
-+ */
-+ best_mask = mask;
-+ strncpy(best_name, ifname,
-+ sizeof(best_name) - 1);
-+ best_name[sizeof(best_name) - 1] = 0;
-+ }
-+ }
-+ }
-+
-+ fclose(fp);
-+
-+ /* If we don't find a match, we'll return the first entry */
-+ first_if = al;
-+
-+ while (al < first_if + n) {
-+ if (strcmp(best_name, al->device) == 0) {
-+ /* Got a match */
-+ return al;
-+ }
-+ al++;
-+ }
-+
-+ return first_if;
-+}
-+
-+#endif
-+
---- traceroute-1.4a12.orig/debian/changelog
-+++ traceroute-1.4a12/debian/changelog
-@@ -0,0 +1,63 @@
-+traceroute (1.4a12-5) unstable; urgency=low
-+
-+ * Restrict the -s option to the super-user.
-+ * Updated documentation for the -s option (closes: #105362).
-+
-+ -- Herbert Xu <herbert@debian.org> Mon, 16 Jul 2001 19:28:45 +1000
-+
-+traceroute (1.4a12-4) unstable; urgency=low
-+
-+ * Updated aclocal.m4 for autoconf 2.50 (closes: #98367).
-+
-+ -- Herbert Xu <herbert@debian.org> Wed, 23 May 2001 18:48:59 +1000
-+
-+traceroute (1.4a12-3) unstable; urgency=low
-+
-+ * Drop privileges earlier.
-+ * Applied "paranoia" patch from Richard Kettlewell (closes: #85619).
-+ - eliminate unbounded sprintf calls
-+ - eliminate unbounded sscanf calls
-+ - strncpy final-null paranoia
-+ * Set HAVE_RAW_OPTIONS (closes: #78475).
-+ * Added missing option to usage (Neale Banks, closes: #88892).
-+
-+ -- Herbert Xu <herbert@debian.org> Fri, 9 Mar 2001 22:24:11 +1100
-+
-+traceroute (1.4a12-2) unstable; urgency=low
-+
-+ * Made changes for dpkg-statoverride (closes: #83817).
-+
-+ -- Herbert Xu <herbert@debian.org> Sun, 28 Jan 2001 21:49:35 +1100
-+
-+traceroute (1.4a12-1) unstable; urgency=low
-+
-+ * New upstream release (closes: #79920, #81395).
-+ * Use struct sockaddr_stroage (closes: #79348).
-+
-+ -- Herbert Xu <herbert@debian.org> Fri, 26 Jan 2001 20:57:21 +1100
-+
-+traceroute (1.4a8-1) unstable; urgency=low
-+
-+ * New upstream release.
-+
-+ -- Herbert Xu <herbert@debian.org> Sat, 9 Dec 2000 14:18:00 +1100
-+
-+traceroute (1.4a5-3) stable unstable; urgency=low
-+
-+ * Fixed a bug where free(3) was called on non-malloced memory.
-+
-+ -- Herbert Xu <herbert@debian.org> Thu, 24 Aug 2000 20:44:51 +1000
-+
-+traceroute (1.4a5-2) frozen unstable; urgency=low
-+
-+ * Use config.* from automake, needed for building traceroute on ARM
-+ (closes: #61267).
-+
-+ -- Herbert Xu <herbert@debian.org> Fri, 31 Mar 2000 07:50:33 +1000
-+
-+traceroute (1.4a5-1) unstable; urgency=low
-+
-+ * Initial release (closes: #34166).
-+
-+ -- Herbert Xu <herbert@debian.org> Mon, 1 Nov 1999 15:11:06 +1100
-+
---- traceroute-1.4a12.orig/debian/control
-+++ traceroute-1.4a12/debian/control
-@@ -0,0 +1,22 @@
-+Source: traceroute
-+Section: net
-+Priority: optional
-+Maintainer: Herbert Xu <herbert@debian.org>
-+Standards-Version: 3.5.5
-+Build-Depends: automake, autoconf, debhelper
-+
-+Package: traceroute
-+Architecture: any
-+Depends: ${shlibs:Depends}
-+Conflicts: suidmanager (<< 0.50)
-+Replaces: netstd
-+Description: Traces the route taken by packets over a TCP/IP network.
-+ The traceroute utility displays the route used by IP packets on their way to a
-+ specified network (or Internet) host. Traceroute displays the IP number and
-+ host name (if possible) of the machines along the route taken by the packets.
-+ Traceroute is used as a network debugging tool. If you're having network
-+ connectivity problems, traceroute will show you where the trouble is coming
-+ from along the route.
-+ .
-+ Install traceroute if you need a tool for diagnosing network connectivity
-+ problems.
---- traceroute-1.4a12.orig/debian/copyright
-+++ traceroute-1.4a12/debian/copyright
-@@ -0,0 +1,16 @@
-+This package was split from netstd by Herbert Xu herbert@debian.org on
-+Mon, 1 Nov 1999 15:14:03 +1100.
-+
-+netstd was created by Peter Tobias tobias@et-inf.fho-emden.de on
-+Wed, 20 Jul 1994 17:23:21 +0200.
-+
-+It was downloaded from ftp://ftp.ee.lbl.gov/.
-+
-+Copyright:
-+
-+Copyright (c) 1988, 1989, 1991, 1994, 1995, 1996, 1997
-+The Regents of the University of California. All rights reserved.
-+
-+The license can be found in /usr/share/common-licenses/BSD.
-+
-+$Id: copyright,v 1.1 1999/11/01 04:34:49 herbert Exp $
---- traceroute-1.4a12.orig/debian/rules
-+++ traceroute-1.4a12/debian/rules
-@@ -0,0 +1,96 @@
-+#!/usr/bin/make -f
-+# GNU copyright 1997 to 1999 by Joey Hess.
-+# Copyright (c) 1999 Herbert Xu <herbert@debian.org>
-+
-+# Uncomment this to turn on verbose mode.
-+#export DH_VERBOSE=1
-+
-+# This is the debhelper compatability version to use.
-+export DH_COMPAT=2
-+
-+build: build-stamp
-+build-stamp:
-+ dh_testdir
-+
-+ if [ ! -f configure.old ]; then \
-+ mv configure configure.old; \
-+ mv config.guess config.guess.old; \
-+ mv config.sub config.sub.old; \
-+ mv linux-include/netinet/in_systm.h linux-include; \
-+ mv linux-include/netinet/ip.h linux-include; \
-+ mv linux-include/netinet/ip_icmp.h linux-include; \
-+ cp /usr/share/automake/config.guess .; \
-+ cp /usr/share/automake/config.sub .; \
-+ autoconf; \
-+ fi
-+ if [ ! -f Makefile ]; then ./configure; fi
-+ $(MAKE) CCOPT="-g -O2"
-+
-+ touch build-stamp
-+
-+clean:
-+ dh_testdir
-+ dh_testroot
-+ rm -f build-stamp install-stamp
-+
-+ -$(MAKE) distclean
-+ if [ -f configure.old ]; then \
-+ mv configure.old configure; \
-+ mv config.guess.old config.guess; \
-+ mv config.sub.old config.sub; \
-+ mv linux-include/in_systm.h linux-include/netinet; \
-+ mv linux-include/ip.h linux-include/netinet; \
-+ mv linux-include/ip_icmp.h linux-include/netinet; \
-+ fi
-+
-+ dh_clean
-+
-+install: build install-stamp
-+install-stamp:
-+ dh_testdir
-+ dh_testroot
-+ dh_clean -k
-+ dh_installdirs
-+
-+ install traceroute debian/traceroute/usr/sbin
-+ cp traceroute.8 debian/traceroute/usr/share/man/man8
-+
-+ touch install-stamp
-+
-+# Build architecture-independent files here.
-+binary-indep: build install
-+# We have nothing to do by default.
-+
-+# Build architecture-dependent files here.
-+binary-arch: build install
-+# dh_testversion
-+ dh_testdir
-+ dh_testroot
-+# dh_installdebconf
-+ dh_installdocs
-+ dh_installexamples
-+ dh_installmenu
-+# dh_installemacsen
-+# dh_installpam
-+# dh_installinit
-+ dh_installcron
-+ dh_installmanpages
-+ dh_installinfo
-+# dh_undocumented
-+ dh_installchangelogs CHANGES
-+ dh_link
-+ dh_strip
-+ dh_compress
-+ dh_fixperms
-+ # You may want to make some executables suid here.
-+ chmod u+s debian/traceroute/usr/sbin/traceroute
-+# dh_makeshlibs
-+ dh_installdeb
-+# dh_perl
-+ dh_shlibdeps
-+ dh_gencontrol
-+ dh_md5sums
-+ dh_builddeb
-+
-+binary: binary-indep binary-arch
-+.PHONY: build clean binary-indep binary-arch binary install
---- traceroute-1.4a12.orig/debian/traceroute.dirs
-+++ traceroute-1.4a12/debian/traceroute.dirs
-@@ -0,0 +1,2 @@
-+usr/sbin
-+usr/share/man/man8
---- traceroute-1.4a12.orig/debian/traceroute.docs
-+++ traceroute-1.4a12/debian/traceroute.docs
-@@ -0,0 +1 @@
-+README
---- traceroute-1.4a12.orig/debian/traceroute.examples
-+++ traceroute-1.4a12/debian/traceroute.examples
-@@ -0,0 +1,2 @@
-+mean.awk
-+median.awk