summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tapset/ChangeLog5
-rw-r--r--tapset/aux_syscalls.stp29
2 files changed, 20 insertions, 14 deletions
diff --git a/tapset/ChangeLog b/tapset/ChangeLog
index 2aca1c4f..d1ce0270 100644
--- a/tapset/ChangeLog
+++ b/tapset/ChangeLog
@@ -1,5 +1,10 @@
2007-09-06 Zhaolei <zhaolei@cn.fujitsu.com>
+ * aux_syscalls.stp (_stp_sockaddr_str): Fix memory access error
+ when calling with addrlen set to 0.
+
+2007-09-06 Zhaolei <zhaolei@cn.fujitsu.com>
+
* aux_syscalls.stp (_module_flags_str): Modify combination of
flags' values.
diff --git a/tapset/aux_syscalls.stp b/tapset/aux_syscalls.stp
index df72773f..b037d67c 100644
--- a/tapset/aux_syscalls.stp
+++ b/tapset/aux_syscalls.stp
@@ -309,36 +309,31 @@ function _struct_itimerval:string(addr:long)
void _stp_sockaddr_str(char *str, const int strlen, char *buf, int len)
{
struct sockaddr *sa = (struct sockaddr *)buf;
- switch (sa->sa_family) {
- case AF_INET:
+ if ((sa->sa_family == AF_INET)&&(len == sizeof(struct sockaddr_in)))
{
struct sockaddr_in *sin = (struct sockaddr_in *)buf;
const unsigned char *addr = (unsigned char *)&sin->sin_addr;
snprintf(str, strlen, "{AF_INET, %d.%d.%d.%d, %d}",
addr[0], addr[1], addr[2], addr[3], ntohs(sin->sin_port));
- break;
}
- case AF_UNIX:
+ else if ((sa->sa_family == AF_UNIX)&&(len == sizeof(struct sockaddr_un)))
{
struct sockaddr_un *sun = (struct sockaddr_un *)buf;
snprintf(str, strlen, "{AF_UNIX, %s}", sun->sun_path);
- break;
}
- case AF_NETLINK:
+ else if ((sa->sa_family == AF_NETLINK)&&(len == sizeof(struct sockaddr_nl)))
{
struct sockaddr_nl *nl = (struct sockaddr_nl *)buf;
snprintf(str, strlen, "{AF_NETLINK, pid=%d, groups=%08x}", nl->nl_pid, nl->nl_groups);
- break;
}
- case AF_INET6:
+ else if ((sa->sa_family == AF_INET6)&&(len == sizeof(struct sockaddr_in6)))
{
// FIXME. Address is probably not correctly displayed
struct sockaddr_in6 *sin = (struct sockaddr_in6 *)buf;
snprintf(str, strlen, "{AF_INET6, %016llx, %d}",
*(long long *)&sin->sin6_addr, ntohs(sin->sin6_port));
- break;
}
- case AF_PACKET:
+ else if ((sa->sa_family == AF_PACKET)&&(len == sizeof(struct sockaddr_ll)))
{
/* FIXME. This needs tested */
struct sockaddr_ll *sll = (struct sockaddr_ll *)buf;
@@ -351,11 +346,17 @@ void _stp_sockaddr_str(char *str, const int strlen, char *buf, int len)
(int)sll->sll_protocol, sll->sll_ifindex, (int)sll->sll_hatype, (int)sll->sll_pkttype,
(int)sll->sll_halen, *(uint64_t *)sll->sll_addr);
#endif
- break;
}
-
- default:
- snprintf(str, strlen, "{unknown address family %d}", sa->sa_family);
+ else
+ {
+ if (len >= sizeof(sa_family_t))
+ {
+ snprintf(str, strlen, "{unknown sockaddr with sa=%d, salen=%d}", sa->sa_family, len);
+ }
+ else
+ {
+ snprintf(str, strlen, "{unknown sockaddr with salen=%d}", len);
+ }
}
}
%}