|
|
Message-ID: <87r2y2vrsg.fsf@gmail.com>
Date: Thu, 29 Jun 2017 15:37:19 +0200
From: Leah Neukirchen <leah@...u.org>
To: musl@...ts.openwall.com
Subject: Out-of-bounds read in twobyte_memmem
Hello,
As mentioned in #musl, twobyte_memmem in memmem.c does an out of
bounds read to the byte after the final byte of the buffer, when it
updates hw using *++h before checking k. Similar code in strstr is
unproblematic since there it will only read the NUL terminator.
Proposed solution is to rewrite the for-loop to make control flow
order explicit, but there may be a more idiomatic solution than this:
static char *twobyte_memmem(const unsigned char *h, size_t k, const unsigned char *n)
{
uint16_t nw = n[0]<<8 | n[1], hw = h[0]<<8 | h[1];
h++;
k--;
for (;;) {
if (hw == nw) return (char *)h-1;
if (!--k) return 0;
hw = hw<<8 | *++h;
}
return 0;
}
This bug was detected by @mourais during development of mblaze on
OpenBSD, using MALLOC_OPTIONS=G.
Thanks,
--
Leah Neukirchen <leah@...u.org> http://leah.zone
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.