tile: Check for pointer add overflow in memchr
As was done in b224637928e9, 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:
parent
4cb89c1581
commit
502697713f
@ -1,5 +1,9 @@
|
|||||||
2017-01-16 Chris Metcalf <cmetcalf@mellanox.com>
|
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.
|
* sysdeps/unix/sysv/linux/tile/ipc_priv.h: New file.
|
||||||
|
|
||||||
2016-01-14 Siddhesh Poyarekar <siddhesh@sourceware.org>
|
2016-01-14 Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||||
|
@ -51,6 +51,10 @@ __memchr (const void *s, int c, size_t n)
|
|||||||
/* Compute the address of the last byte. */
|
/* Compute the address of the last byte. */
|
||||||
last_byte_ptr = (const char *) s + n - 1;
|
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. */
|
/* Compute the address of the word containing the last byte. */
|
||||||
last_word_ptr = (const uint64_t *) ((uintptr_t) last_byte_ptr & -8);
|
last_word_ptr = (const uint64_t *) ((uintptr_t) last_byte_ptr & -8);
|
||||||
|
|
||||||
|
@ -51,6 +51,10 @@ __memchr (const void *s, int c, size_t n)
|
|||||||
/* Compute the address of the last byte. */
|
/* Compute the address of the last byte. */
|
||||||
last_byte_ptr = (const char *) s + n - 1;
|
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. */
|
/* Compute the address of the word containing the last byte. */
|
||||||
last_word_ptr = (const uint32_t *) ((uintptr_t) last_byte_ptr & -4);
|
last_word_ptr = (const uint32_t *) ((uintptr_t) last_byte_ptr & -4);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user