diff options
author | Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com> | 2016-12-28 11:38:56 -0200 |
---|---|---|
committer | Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com> | 2016-12-28 11:44:31 -0200 |
commit | 5e628dd118807981bdd880731e6fdf019f64a245 (patch) | |
tree | ab1efb6529f5b0c7ee03ab5e2f412e8d212f4717 /sysdeps/powerpc/powerpc32/power7 | |
parent | 9314d3545e6641063b490918e2e8716556ba20db (diff) | |
download | glibc-5e628dd118807981bdd880731e6fdf019f64a245.tar glibc-5e628dd118807981bdd880731e6fdf019f64a245.tar.gz glibc-5e628dd118807981bdd880731e6fdf019f64a245.tar.bz2 glibc-5e628dd118807981bdd880731e6fdf019f64a245.zip |
powerpc: Fix powerpc32/power7 memchr for large input sizes
The same error fixed in commit b224637928e9fc04e3cef3e10d02ccf042d01584
happens in the 32-bit implementation of memchr for power7.
This patch adopts the same solution, with a minimal change: it
implements a saturated addition where overflows sets the maximum pointer
size to UINTPTR_MAX.
Diffstat (limited to 'sysdeps/powerpc/powerpc32/power7')
-rw-r--r-- | sysdeps/powerpc/powerpc32/power7/memchr.S | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/sysdeps/powerpc/powerpc32/power7/memchr.S b/sysdeps/powerpc/powerpc32/power7/memchr.S index 318168b4cf..5ce2bb0bad 100644 --- a/sysdeps/powerpc/powerpc32/power7/memchr.S +++ b/sysdeps/powerpc/powerpc32/power7/memchr.S @@ -26,7 +26,16 @@ ENTRY (__memchr) dcbt 0,r3 clrrwi r8,r3,2 insrwi r4,r4,8,16 /* Replicate byte to word. */ - add r7,r3,r5 /* Calculate the last acceptable address. */ + + /* Calculate the last acceptable address and check for possible + addition overflow by using satured math: + r7 = r3 + r5 + r7 |= -(r7 < x) */ + add r7,r3,r5 + subfc r6,r3,r7 + subfe r9,r9,r9 + or r7,r7,r9 + insrwi r4,r4,16,0 cmplwi r5,16 li r9, -1 |