about summary refs log tree commit diff
path: root/sysdeps/x86_64/multiarch/strlen-avx2.S
diff options
context:
space:
mode:
authorNoah Goldstein <goldstein.w.n@gmail.com>2022-09-20 17:58:04 -0700
committerSunil K Pandey <skpgkp2@gmail.com>2022-11-24 18:06:14 -0800
commitc9e58ae23402eb82877de90fd8a18519c086ed87 (patch)
tree72bfc0e21aac7e79c399f1ca23051689a6adc4a4 /sysdeps/x86_64/multiarch/strlen-avx2.S
parent2b05bbfd35f9a7645a74dbeef56bf1000c8ee0b5 (diff)
downloadglibc-c9e58ae23402eb82877de90fd8a18519c086ed87.tar.gz
glibc-c9e58ae23402eb82877de90fd8a18519c086ed87.tar.xz
glibc-c9e58ae23402eb82877de90fd8a18519c086ed87.zip
x86: Fix wcsnlen-avx2 page cross length comparison [BZ #29591]
Previous implementation was adjusting length (rsi) to match
bytes (eax), but since there is no bound to length this can cause
overflow.

Fix is to just convert the byte-count (eax) to length by dividing by
sizeof (wchar_t) before the comparison.

Full check passes on x86-64 and build succeeds w/ and w/o multiarch.

(cherry picked from commit b0969fa53a28b4ab2159806bf6c99a98999502ee)
Diffstat (limited to 'sysdeps/x86_64/multiarch/strlen-avx2.S')
-rw-r--r--sysdeps/x86_64/multiarch/strlen-avx2.S7
1 files changed, 2 insertions, 5 deletions
diff --git a/sysdeps/x86_64/multiarch/strlen-avx2.S b/sysdeps/x86_64/multiarch/strlen-avx2.S
index 376889668d..2a314f07da 100644
--- a/sysdeps/x86_64/multiarch/strlen-avx2.S
+++ b/sysdeps/x86_64/multiarch/strlen-avx2.S
@@ -542,14 +542,11 @@ L(return_vzeroupper):
 L(cross_page_less_vec):
 	tzcntl	%eax, %eax
 #  ifdef USE_AS_WCSLEN
-	/* NB: Multiply length by 4 to get byte count.  */
-	sall	$2, %esi
+	/* NB: Divide by 4 to convert from byte-count to length.  */
+	shrl	$2, %eax
 #  endif
 	cmpq	%rax, %rsi
 	cmovb	%esi, %eax
-#  ifdef USE_AS_WCSLEN
-	shrl	$2, %eax
-#  endif
 	VZEROUPPER_RETURN
 # endif