[RFC/PATCH] memcpy-ssse3: add overlap checks

Felipe Contreras felipe.contreras@gmail.com
Mon Apr 11 19:11:00 GMT 2011


Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 sysdeps/x86_64/multiarch/memcpy-ssse3-back.S |   12 ++++++++++++
 sysdeps/x86_64/multiarch/memcpy-ssse3.S      |   12 ++++++++++++
 2 files changed, 24 insertions(+), 0 deletions(-)

On 2.13 the behavior of memcpy changed on ssse3 so that it can go backwards and
cause problems on improper applications. On 2.14 memcpy is properly versioned
so that the new behavior is only triggered on newly compiled applications.

However, there are still applications that rely on the old behavior, and it's
not trivial to find them all.

I therefore propose to have a transition period on 2.14 where badly behaved
applications crash. Then, on 2.15, remove these extra checks.

I tried to add this code on memcpy_chk but somehow it doesn't seem to work for
me.

As mentioned in bug #12518, right after booting I've seen issues on pulseaudio
and readahead-collector on my Fedora 14, which suggests there might be many
more.

What do you think?

diff --git a/sysdeps/x86_64/multiarch/memcpy-ssse3-back.S b/sysdeps/x86_64/multiarch/memcpy-ssse3-back.S
index 48c974e..659cdc5 100644
--- a/sysdeps/x86_64/multiarch/memcpy-ssse3-back.S
+++ b/sysdeps/x86_64/multiarch/memcpy-ssse3-back.S
@@ -57,6 +57,18 @@ END (MEMCPY_CHK)
 #endif
 
 ENTRY (MEMCPY)
+#ifndef USE_AS_MEMMOVE
+	/* TODO remove on 2.15 (after some transition period) */
+	lea	(%rsi, %rdx), %r9
+	lea	(%rdi, %rdx), %r11
+	cmp	%r9, %rdi		/* dest start >= source end */
+	jae	L(nonoverlap)		/*  -> nonoverlapping */
+	cmp	%r11, %rsi		/* source start >= destination end */
+	jae	L(nonoverlap)		/*  -> nonoverlapping */
+	jmp     HIDDEN_JUMPTARGET (__chk_fail)
+L(nonoverlap):
+#endif
+
 	mov	%rdi, %rax
 #ifdef USE_AS_MEMPCPY
 	add	%rdx, %rax
diff --git a/sysdeps/x86_64/multiarch/memcpy-ssse3.S b/sysdeps/x86_64/multiarch/memcpy-ssse3.S
index 9a878d3..572f4a7 100644
--- a/sysdeps/x86_64/multiarch/memcpy-ssse3.S
+++ b/sysdeps/x86_64/multiarch/memcpy-ssse3.S
@@ -57,6 +57,18 @@ END (MEMCPY_CHK)
 #endif
 
 ENTRY (MEMCPY)
+#ifndef USE_AS_MEMMOVE
+	/* TODO remove on 2.15 (after some transition period) */
+	lea	(%rsi, %rdx), %r9
+	lea	(%rdi, %rdx), %r11
+	cmp	%r9, %rdi		/* dest start >= source end */
+	jae	L(nonoverlap)		/*  -> nonoverlapping */
+	cmp	%r11, %rsi		/* source start >= destination end */
+	jae	L(nonoverlap)		/*  -> nonoverlapping */
+	jmp     HIDDEN_JUMPTARGET (__chk_fail)
+L(nonoverlap):
+#endif
+
 	mov	%rdi, %rax
 #ifdef USE_AS_MEMPCPY
 	add	%rdx, %rax
-- 
1.7.5.rc1



More information about the Libc-alpha mailing list