diff options
author | jkim <jkim@FreeBSD.org> | 2011-10-06 19:59:14 +0000 |
---|---|---|
committer | jkim <jkim@FreeBSD.org> | 2011-10-06 19:59:14 +0000 |
commit | 9a911728e76f65555fab4e616679856f71205f36 (patch) | |
tree | 488efd3691e3e3c73b1b1d9e023e68a0e96429a6 /sys/compat/linux/linux_socket.c | |
parent | e2b10ad6873260e564e97bf5775be672135eb754 (diff) | |
download | FreeBSD-src-9a911728e76f65555fab4e616679856f71205f36.zip FreeBSD-src-9a911728e76f65555fab4e616679856f71205f36.tar.gz |
Unroll inlined strnlen(9) and make it easier to read. No functional change.
Diffstat (limited to 'sys/compat/linux/linux_socket.c')
-rw-r--r-- | sys/compat/linux/linux_socket.c | 16 |
1 files changed, 6 insertions, 10 deletions
diff --git a/sys/compat/linux/linux_socket.c b/sys/compat/linux/linux_socket.c index a86a23f..ccecb81 100644 --- a/sys/compat/linux/linux_socket.c +++ b/sys/compat/linux/linux_socket.c @@ -99,12 +99,11 @@ do_sa_get(struct sockaddr **sap, const struct osockaddr *osa, int *osalen, int error=0, bdom; struct sockaddr *sa; struct osockaddr *kosa; - int alloclen; #ifdef INET6 int oldv6size; struct sockaddr_in6 *sin6; #endif - int namelen; + int alloclen, hdrlen, namelen; if (*osalen < 2 || *osalen > UCHAR_MAX || !osa) return (EINVAL); @@ -167,14 +166,11 @@ do_sa_get(struct sockaddr **sap, const struct osockaddr *osa, int *osalen, } } - if ((bdom == AF_LOCAL) && (*osalen > sizeof(struct sockaddr_un))) { - for (namelen = 0; - namelen < *osalen - offsetof(struct sockaddr_un, sun_path); - namelen++) - if (!((struct sockaddr_un *)kosa)->sun_path[namelen]) - break; - if (namelen + offsetof(struct sockaddr_un, sun_path) > - sizeof(struct sockaddr_un)) { + 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); + if (hdrlen + namelen > sizeof(struct sockaddr_un)) { error = EINVAL; goto out; } |