string: Fix buffer overrun in picolibc/newlib/libc/string/strrchr.c (#184)
Reported by prodisDown: In picolibc/newlib/libc/string/strrchr.c if (i) { while ((s=strchr(s, i))) { last = s; s++; } } else { last = strchr(s, i); } Value (for example 0xFFFFFF00) in if (i) can pass test and then be typecasted to char inside strchr(). Then s++ and then buffer overrun. It can be fixed by preventive typecast i = (int) (char) i; or typecasting inside expression if ((char) i). Fixed by casting to char. Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
parent
dcd564f65c
commit
c51f05c597
|
@ -34,10 +34,11 @@ strrchr (const char *s,
|
||||||
int i)
|
int i)
|
||||||
{
|
{
|
||||||
const char *last = NULL;
|
const char *last = NULL;
|
||||||
|
char c = i;
|
||||||
|
|
||||||
if (i)
|
if (c)
|
||||||
{
|
{
|
||||||
while ((s=strchr(s, i)))
|
while ((s=strchr(s, c)))
|
||||||
{
|
{
|
||||||
last = s;
|
last = s;
|
||||||
s++;
|
s++;
|
||||||
|
@ -45,8 +46,8 @@ strrchr (const char *s,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
last = strchr(s, i);
|
last = strchr(s, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (char *) last;
|
return (char *) last;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue