2008-07-02 Jeff Johnston <jjohnstn@redhat.com>

* libc/machine/mips/strncpy.c (strncpy): Fix logic so unaligned
        source data is taken care of before loop unrolling.
This commit is contained in:
Jeff Johnston 2008-07-02 18:17:48 +00:00
parent bb82bbe6ff
commit a9f7d0a7a7
2 changed files with 25 additions and 0 deletions

View file

@ -1,3 +1,8 @@
2008-07-02 Jeff Johnston <jjohnstn@redhat.com>
* libc/machine/mips/strncpy.c (strncpy): Fix logic so unaligned
source data is taken care of before loop unrolling.
2008-06-25 Hans-Peter Nilsson <hp@axis.com>
Fix strict-aliasing issues with _strtod_r and Storeinc.

View file

@ -82,6 +82,26 @@ strncpy (char *dst0, const char *src0, size_t count)
dst = (unsigned char *)dst0;
src = (unsigned const char *)src0;
/* Take care of any odd bytes in the source data because we
* want to unroll where we read ahead 2 or 4 bytes at a time and then
* check each byte for the null terminator. This can result in
* a segfault for the case where the source pointer is unaligned,
* the null terminator is in valid memory, but reading 2 or 4 bytes at a
* time blindly eventually goes outside of valid memory. */
while ((src & (UNROLL_FACTOR - 1)) != 0 && count > 0)
{
*dst++ = ch = *src++;
--count;
if (ch == '\0')
{
end = dst + count;
while (dst != end)
*dst++ = '\0';
return dst0;
}
}
if (__builtin_expect (count >= 4, 1))
{
odd_bytes = (count & (UNROLL_FACTOR - 1));