summaryrefslogtreecommitdiffstats
path: root/sys/compat
diff options
context:
space:
mode:
authorjkim <jkim@FreeBSD.org>2011-10-06 21:09:28 +0000
committerjkim <jkim@FreeBSD.org>2011-10-06 21:09:28 +0000
commit40f14199fbe765dba43b1948da218393e38f8e5f (patch)
tree850e2e87e49f0314a6375cd3b040366735ee206c /sys/compat
parentbd4e9fe2ca235f77b480cd2357ca375a084f9a8b (diff)
downloadFreeBSD-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')
-rw-r--r--sys/compat/linux/linux_socket.c12
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;
OpenPOWER on IntegriCloud