summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authorgreen <green@FreeBSD.org>2001-11-06 19:26:51 +0000
committergreen <green@FreeBSD.org>2001-11-06 19:26:51 +0000
commitb9c07fd74bf861c1d7590051e5c081778f520952 (patch)
treeb90237214bec8f2fd494e7cba0badb10c2964729 /usr.bin
parenta2723fd68ce9deb19e4676b8667131cd452c52cf (diff)
downloadFreeBSD-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')
-rw-r--r--usr.bin/truss/syscalls.c74
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;
}
OpenPOWER on IntegriCloud