mirror of
https://github.com/opnsense/src.git
synced 2026-06-09 08:43:19 -04:00
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:
parent
d917674e85
commit
dec17687ad
1 changed files with 49 additions and 29 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue