diff options
author | jkim <jkim@FreeBSD.org> | 2011-10-06 21:09:28 +0000 |
---|---|---|
committer | jkim <jkim@FreeBSD.org> | 2011-10-06 21:09:28 +0000 |
commit | 40f14199fbe765dba43b1948da218393e38f8e5f (patch) | |
tree | 850e2e87e49f0314a6375cd3b040366735ee206c /sys/compat/linux/linux_socket.c | |
parent | bd4e9fe2ca235f77b480cd2357ca375a084f9a8b (diff) | |
download | FreeBSD-src-40f14199fbe765dba43b1948da218393e38f8e5f.zip FreeBSD-src-40f14199fbe765dba43b1948da218393e38f8e5f.tar.gz |
Make sure to ignore the leading NULL byte from Linux abstract namespace.
Diffstat (limited to 'sys/compat/linux/linux_socket.c')
-rw-r--r-- | sys/compat/linux/linux_socket.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/sys/compat/linux/linux_socket.c b/sys/compat/linux/linux_socket.c index 66becb3..08dd74c 100644 --- a/sys/compat/linux/linux_socket.c +++ b/sys/compat/linux/linux_socket.c @@ -90,6 +90,7 @@ linux_getsockaddr(struct sockaddr **sap, const struct osockaddr *osa, int osalen int oldv6size; struct sockaddr_in6 *sin6; #endif + char *name; int alloclen, hdrlen, namelen; if (osalen < 2 || osalen > UCHAR_MAX || !osa) @@ -158,8 +159,15 @@ linux_getsockaddr(struct sockaddr **sap, const struct osockaddr *osa, int osalen if (bdom == AF_LOCAL && osalen > sizeof(struct sockaddr_un)) { hdrlen = offsetof(struct sockaddr_un, sun_path); - namelen = strnlen(((struct sockaddr_un *)kosa)->sun_path, - osalen - hdrlen); + name = ((struct sockaddr_un *)kosa)->sun_path; + if (*name == '\0') { + /* + * Linux abstract namespace starts with a NULL byte. + * XXX We do not support abstract namespace yet. + */ + namelen = strnlen(name + 1, osalen - hdrlen - 1) + 1; + } else + namelen = strnlen(name, osalen - hdrlen); if (hdrlen + namelen > sizeof(struct sockaddr_un)) { error = ENAMETOOLONG; goto out; |