[prev in list] [next in list] [prev in thread] [next in thread]
List: tcpdump-patches
Subject: tcpdump3.5 segmentation faults under BSDI4.1
From: Jerry Ji <jerryji () pacific ! net ! sg>
Date: 2000-09-08 8:14:00
[Download RAW message or body]
Dear developer,
Kindly be informed that your latest release tcpdump3.5 segmentation
faults under
4.1 BSDI BSD/OS 4.1 Kernel #1: [host]:/usr/src/sys/compile/GENERIC i386
with gcc version egcs-2.91.66 19990314 (egcs-1.1.2 release)
This is due to recursive call from missing/inet_aton.c to
inet_addr(const char *ip_addr) which in turn calls inet_aton and on and
on...
So suggest to use the inet_aton.c as attached.
Besides, the package won't compile without #include <arpa/inet.h>
in missing/inet_pton.c
Hope someone is there listening and thanks for all the effort!
---
Sincerely,
Jerry Ji
Network Engineer
Pacific Internet Ltd.
Singapore
["inet_aton.c" (TEXT/PLAIN)]
#include <sys/param.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
/*
* Check whether "cp" is a valid ascii representation
* of an Internet address and convert to a binary address.
* Returns 1 if the address is valid, 0 if not.
* This replaces inet_addr, the return value from which
* cannot distinguish between failure and a local broadcast address.
*/
int
inet_aton(cp, addr)
register const char *cp;
struct in_addr *addr;
{
register unsigned int val; /* changed from u_long --david */
register int base, n;
register char c;
u_int parts[4];
register u_int *pp = parts;
c = *cp;
for (;;) {
/*
* Collect number up to ``.''.
* Values are specified as for C:
* 0x=hex, 0=octal, isdigit=decimal.
*/
if (!isdigit((int)c))
return (0);
val = 0; base = 10;
if (c == '0') {
c = *++cp;
if (c == 'x' || c == 'X')
base = 16, c = *++cp;
else
base = 8;
}
for (;;) {
if (isascii((int)c) && isdigit((int)c)) {
val = (val * base) + (c - '0');
c = *++cp;
} else if (base == 16 && isascii((int)c) && isxdigit((int)c)) {
val = (val << 4) |
(c + 10 - (islower((int)c) ? 'a' : 'A'));
c = *++cp;
} else
break;
}
if (c == '.') {
/*
* Internet format:
* a.b.c.d
* a.b.c (with c treated as 16 bits)
* a.b (with b treated as 24 bits)
*/
if (pp >= parts + 3)
return (0);
*pp++ = val;
c = *++cp;
} else
break;
}
/*
* Check for trailing characters.
*/
if (c != '\0' && (!isascii((int)c) || !isspace((int)c)))
return (0);
/*
* Concoct the address according to
* the number of parts specified.
*/
n = pp - parts + 1;
switch (n) {
case 0:
return (0); /* initial nondigit */
case 1: /* a -- 32 bits */
break;
case 2: /* a.b -- 8.24 bits */
if (val > 0xffffff)
return (0);
val |= parts[0] << 24;
break;
case 3: /* a.b.c -- 8.8.16 bits */
if (val > 0xffff)
return (0);
val |= (parts[0] << 24) | (parts[1] << 16);
break;
case 4: /* a.b.c.d -- 8.8.8.8 bits */
if (val > 0xff)
return (0);
val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
break;
}
if (addr)
addr->s_addr = htonl(val);
return (1);
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic