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.
This commit is contained in:
Brian Feldman 2001-11-06 19:26:51 +00:00
parent d917674e85
commit dec17687ad

View file

@ -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);
tmp = malloc(100);
if (sa->sa_family == AF_INET) {
struct sockaddr_in *sin = (struct sockaddr_in *)sa;
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;
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);
/* 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 {
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, "} }");
if (get_struct(fd, (void *)args[sc->offset], (void *)&ss, ss.ss_len)
== -1)
err(2, "get_struct %p", (void *)args[sc->offset]);
}
switch (ss.ss_family) {
case AF_INET:
sin = (struct sockaddr_in *)&ss;
inet_ntop(AF_INET, &sin->sin_addr, addr, sizeof addr);
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);
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;
}