diff options
author | green <green@FreeBSD.org> | 2001-11-06 19:26:51 +0000 |
---|---|---|
committer | green <green@FreeBSD.org> | 2001-11-06 19:26:51 +0000 |
commit | b9c07fd74bf861c1d7590051e5c081778f520952 (patch) | |
tree | b90237214bec8f2fd494e7cba0badb10c2964729 /usr.bin/truss | |
parent | a2723fd68ce9deb19e4676b8667131cd452c52cf (diff) | |
download | FreeBSD-src-b9c07fd74bf861c1d7590051e5c081778f520952.zip FreeBSD-src-b9c07fd74bf861c1d7590051e5c081778f520952.tar.gz |
Add missing include for <ctype.h>
Make sockaddr printing code unbad.
Always copy in sizeof(sockaddr_un) bytes for an AF_UNIX sockaddr,
despite what the length may be.
Diffstat (limited to 'usr.bin/truss')
-rw-r--r-- | usr.bin/truss/syscalls.c | 74 |
1 files changed, 47 insertions, 27 deletions
diff --git a/usr.bin/truss/syscalls.c b/usr.bin/truss/syscalls.c index 2512225..fd3c700 100644 --- a/usr.bin/truss/syscalls.c +++ b/usr.bin/truss/syscalls.c @@ -45,6 +45,7 @@ static const char rcsid[] = #include <netinet/in.h> #include <arpa/inet.h> +#include <ctype.h> #include <err.h> #include <signal.h> #include <stdio.h> @@ -287,39 +288,58 @@ print_arg(int fd, struct syscall_args *sc, unsigned long *args) { break; case Sockaddr: { - struct sockaddr *sa; + struct sockaddr_storage ss; char addr[64]; - u_char sa_len; - char *p, *q; - int i, len; + struct sockaddr_in *sin; + struct sockaddr_in6 *sin6; + struct sockaddr_un *sun; + struct sockaddr *sa; + char *p; + u_char *q; + int i; - /* yuck: get sa_len */ - get_struct(fd, (void *)args[sc->offset], (void *)&sa_len, sizeof sa_len); - sa = malloc(sa_len); - get_struct(fd, (void *)args[sc->offset], (void *)sa, sa_len); + /* yuck: get ss_len */ + if (get_struct(fd, (void *)args[sc->offset], (void *)&ss, + sizeof(ss.ss_len) + sizeof(ss.ss_family)) == -1) + err(1, "get_struct %p", (void *)args[sc->offset]); + /* sockaddr_un never have the length filled in! */ + if (ss.ss_family == AF_UNIX) { + if (get_struct(fd, (void *)args[sc->offset], (void *)&ss, + sizeof(*sun)) + == -1) + err(2, "get_struct %p", (void *)args[sc->offset]); + } else { + if (get_struct(fd, (void *)args[sc->offset], (void *)&ss, ss.ss_len) + == -1) + err(2, "get_struct %p", (void *)args[sc->offset]); + } - tmp = malloc(100); - if (sa->sa_family == AF_INET) { - struct sockaddr_in *sin = (struct sockaddr_in *)sa; + switch (ss.ss_family) { + case AF_INET: + sin = (struct sockaddr_in *)&ss; inet_ntop(AF_INET, &sin->sin_addr, addr, sizeof addr); - sprintf(tmp, "{ AF_INET %s:%d }", addr, htons(sin->sin_port)); - } else if (sa->sa_family == AF_INET6) { - struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa; + asprintf(&tmp, "{ AF_INET %s:%d }", addr, htons(sin->sin_port)); + break; + case AF_INET6: + sin6 = (struct sockaddr_in6 *)&ss; inet_ntop(AF_INET6, &sin6->sin6_addr, addr, sizeof addr); - sprintf(tmp, "{ AF_INET6 [%s]:%d }", addr, htons(sin6->sin6_port)); - } else if (sa->sa_family == AF_UNIX) { - struct sockaddr_un *sun = (struct sockaddr_un *)sa; - sprintf(tmp, "{ AF_UNIX \"%s\" }", sun->sun_path); - } else { - p = tmp; - p += sprintf(p, "{ sa_len = %d, sa_family = %d, sa_data = {", - sa->sa_len, sa->sa_family); - for (q = sa->sa_data; q < ((char *)sa) + sa_len; q++) - p += sprintf(p, " 0x%02x,", *q); - p--; - p += sprintf(p, "} }"); + asprintf(&tmp, "{ AF_INET6 [%s]:%d }", addr, htons(sin6->sin6_port)); + break; + case AF_UNIX: + sun = (struct sockaddr_un *)&ss; + asprintf(&tmp, "{ AF_UNIX \"%s\" }", sun->sun_path); + break; + default: + sa = (struct sockaddr *)&ss; + asprintf(&tmp, "{ sa_len = %d, sa_family = %d, sa_data = {%n%*s } }", + (int)sa->sa_len, (int)sa->sa_family, &i, + 6 * (int)(sa->sa_len - ((char *)&sa->sa_data - (char *)sa)), ""); + if (tmp != NULL) { + p = tmp + i; + for (q = (u_char *)&sa->sa_data; q < (u_char *)sa + sa->sa_len; q++) + p += sprintf(p, " %#02x,", *q); + } } - free(sa); } break; } |