diff options
author | zhaolei <zhaolei> | 2007-09-06 01:28:41 +0000 |
---|---|---|
committer | zhaolei <zhaolei> | 2007-09-06 01:28:41 +0000 |
commit | 7d0ea3216d499fdc77dcd98d7d75ac14441421f8 (patch) | |
tree | 2a4907e097a2af323323cd6b15a438aa3dfbf879 | |
parent | 66028aa04a4b335a910fdaec783dad8c9627137e (diff) | |
download | systemtap-steved-7d0ea3216d499fdc77dcd98d7d75ac14441421f8.tar.gz systemtap-steved-7d0ea3216d499fdc77dcd98d7d75ac14441421f8.tar.xz systemtap-steved-7d0ea3216d499fdc77dcd98d7d75ac14441421f8.zip |
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.
-rw-r--r-- | tapset/ChangeLog | 5 | ||||
-rw-r--r-- | tapset/aux_syscalls.stp | 29 |
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); + } } } %} |