aboutsummaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2017-01-03 12:19:12 -0200
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2017-01-03 14:24:53 -0200
commit8dad72997af2be0dc72a4bc7dbe82d85c90334fc (patch)
treedc5d83dfccb1e2fba0354ecc9f13a538d47fbb42 /sysdeps
parentd4d629e6187e33050902824a94498b6096eacac9 (diff)
downloadglibc-8dad72997af2be0dc72a4bc7dbe82d85c90334fc.tar
glibc-8dad72997af2be0dc72a4bc7dbe82d85c90334fc.tar.gz
glibc-8dad72997af2be0dc72a4bc7dbe82d85c90334fc.tar.bz2
glibc-8dad72997af2be0dc72a4bc7dbe82d85c90334fc.zip
Fix x86 strncat optimized implementation for large sizes
Similar to BZ#19387, BZ#21014, and BZ#20971, both x86 sse2 strncat optimized assembly implementations do not handle the size overflow correctly. The x86_64 one is in fact an issue with strcpy-sse2-unaligned, but that is triggered also with strncat optimized implementation. This patch uses a similar strategy used on 3daef2c8ee4df2, where saturared math is used for overflow case. Checked on x86_64-linux-gnu and i686-linux-gnu. It fixes BZ #19390. [BZ #19390] * string/test-strncat.c (test_main): Add tests with SIZE_MAX as maximum string size. * sysdeps/i386/i686/multiarch/strcat-sse2.S (STRCAT): Avoid overflow in pointer addition. * sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S (STRCPY): Likewise.
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/i386/i686/multiarch/strcat-sse2.S2
-rw-r--r--sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S2
2 files changed, 4 insertions, 0 deletions
diff --git a/sysdeps/i386/i686/multiarch/strcat-sse2.S b/sysdeps/i386/i686/multiarch/strcat-sse2.S
index 145ae66894..6359c7330c 100644
--- a/sysdeps/i386/i686/multiarch/strcat-sse2.S
+++ b/sysdeps/i386/i686/multiarch/strcat-sse2.S
@@ -227,6 +227,8 @@ L(StartStrcpyPart):
pxor %xmm0, %xmm0
# ifdef USE_AS_STRNCAT
add %ecx, %ebx
+ sbb %edx, %edx
+ or %edx, %ebx
# endif
sub %ecx, %eax
jmp L(Unalign16Both)
diff --git a/sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S b/sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S
index c038043693..6a5ab7ab26 100644
--- a/sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S
+++ b/sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S
@@ -99,6 +99,8 @@ L(Unalign16Both):
sub %rcx, %rdi
# ifdef USE_AS_STRNCPY
add %rcx, %r8
+ sbb %rcx, %rcx
+ or %rcx, %r8
# endif
mov $16, %rcx
movdqa (%rsi, %rcx), %xmm1