[PATCH][BZ #15698] Fix memory overrun in getifaddrs_internal.
H.J. Lu
hjl.tools@gmail.com
Tue Oct 8 17:13:00 GMT 2013
On Tue, Oct 8, 2013 at 9:57 AM, Ondřej Bílka <neleai@seznam.cz> wrote:
> Hi, a code at https://sourceware.org/bugzilla/show_bug.cgi?id=15698
> contains a simple off-by-one error when preflen is divisible by 8.
>
> Following code should fix this, as preflen is unsigned I added check for
> zero len to be sure we do not cause underflow.
>
> OK to commit?
>
> * sysdeps/unix/sysv/linux/ifaddrs.c (getifaddrs_internal): Fix
> memory overrun.
Missing BZ #.
> diff --git a/sysdeps/unix/sysv/linux/ifaddrs.c b/sysdeps/unix/sysv/linux/ifaddrs.c
> index 89fda15..09676de 100644
> --- a/sysdeps/unix/sysv/linux/ifaddrs.c
> +++ b/sysdeps/unix/sysv/linux/ifaddrs.c
> @@ -780,7 +780,7 @@ getifaddrs_internal (struct ifaddrs **ifap)
> else
> preflen = ifam->ifa_prefixlen;
>
> - for (i = 0; i < (preflen / 8); i++)
> + for (i = 0; preflen && i < ((preflen - 1) / 8); i++)
> *cp++ = 0xff;
> c = 0xff;
> c <<= (8 - (preflen % 8));
I don't think it is correct for netmask. When
preflen == max_prefixlen, netmask should be all 1's.
Something like:
for (i = 0; i < (preflen / 8); i++)
*cp++ = 0xff;
if (preflen != max_prefixlen)
{
c = 0xff;
c <<= (8 - (preflen % 8));
*cp = c;
}
BTW, max_prefixlen is always > 0 when cp != NULL.
--
H.J.
More information about the Libc-alpha
mailing list