tile: Check for pointer add overflow in memchr

As was done in b224637928, check for large size causing an overflow
in the loop that walks over the array.

Branching out of line here is the fastest approach for handling this
problem, since tile can bundle the instructions to compute the branch
test in parallel with doing the required memchr loop setup computation.

Unfortunately, the existing saturated ops (e.g. tilegx addxsc) are
all signed saturing ops, so don't help with unsigned saturation.
This commit is contained in:
Chris Metcalf 2017-01-16 15:38:25 -05:00
parent 4cb89c1581
commit 502697713f
3 changed files with 12 additions and 0 deletions

View File

@ -1,5 +1,9 @@
2017-01-16 Chris Metcalf <cmetcalf@mellanox.com>
* sysdeps/tile/tilegx/memchr.c (__memchr): Handle pointer
wrap-around.
* sysdeps/tile/tilepro/memchr.c (__memchr): Likewise.
* sysdeps/unix/sysv/linux/tile/ipc_priv.h: New file.
2016-01-14 Siddhesh Poyarekar <siddhesh@sourceware.org>

View File

@ -51,6 +51,10 @@ __memchr (const void *s, int c, size_t n)
/* Compute the address of the last byte. */
last_byte_ptr = (const char *) s + n - 1;
/* Handle possible addition overflow. */
if (__glibc_unlikely ((uintptr_t) last_byte_ptr < (uintptr_t) s))
last_byte_ptr = (const char *) UINTPTR_MAX;
/* Compute the address of the word containing the last byte. */
last_word_ptr = (const uint64_t *) ((uintptr_t) last_byte_ptr & -8);

View File

@ -51,6 +51,10 @@ __memchr (const void *s, int c, size_t n)
/* Compute the address of the last byte. */
last_byte_ptr = (const char *) s + n - 1;
/* Handle possible addition overflow. */
if (__glibc_unlikely ((uintptr_t) last_byte_ptr < (uintptr_t) s))
last_byte_ptr = (const char *) UINTPTR_MAX;
/* Compute the address of the word containing the last byte. */
last_word_ptr = (const uint32_t *) ((uintptr_t) last_byte_ptr & -4);