[PATCH] avoid buffer overflow in sunrpc clnt_create (BZ #22542)
Martin Sebor
msebor@gmail.com
Sun Dec 3 23:09:00 GMT 2017
Annotating sockaddr_un::sun_path with attribute nonstring as
suggested by Carlos in [1] triggers a warning for call to strlen()
with the array as an argument in the clntunix_create() function.
The only caller of the function in Glibc, clnt_create(), calls
strcpy() to copy the string passed to it as the hostname argument
to the sun_path array member of a local struct sockadd_un object.
This causes a buffer overflow when the string is longer than
the size of the sun_path member array.
The attached patch tries to fix both of these problems.
It annotates the sun_path array member of struct sockaddr_un
with attribute nonstring.
It then changes clntunix_create() to use strnlen() instead of
strlen() to read as most as many characters from the sun_path
array as it has elements.
Finally, the patch changes the clnt_create() function to reject
hostnames longer than sizeof (sun_path) to avoid the overflow.
I considered changing clnt_create() to dynamically allocate
a larger object than sizeof (struct sockaddr_un) to fit the
whole hostname but decided to keep it simple. Longer names
aren't supported now (they cause a buffer overflow) and since
no one complained, it seems good enough. However, if it is
considered important to handle longer hostnames, it can be
changed.
Given the approach I chose in clnt_create(), using strnlen()
in clntunix_create() isn't really necessary to avoid reading
past the end of sun_path because it's nul-terminated, but it
is necessary to avoid the warning.
If it's decided that clnt_create() should handle overlong
hostnames then clntunix_create() will need to change back
to use either strlen(sun_path) and the warning will need
to be suppressed by some other means, or to use memchr().
Thanks
Martin
[1] https://sourceware.org/ml/libc-alpha/2017-11/msg00932.html
-------------- next part --------------
A non-text attachment was scrubbed...
Name: glibc-sun_path-nonstring.diff
Type: text/x-patch
Size: 4585 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/libc-alpha/attachments/20171203/8794940c/attachment.bin>
More information about the Libc-alpha
mailing list