[git commit 0_9_30] i386: store errno value before using __set_errno()

Ingo van Lil inguin at gmx.de
Sat Oct 10 16:44:02 UTC 2009


commit: http://git.uclibc.org/uClibc/commit/?id=f7c5ccb84452671a6e3104a894303b346123f345
branch: http://git.uclibc.org/uClibc/commit/?id=refs/heads/0_9_30

The __syscall_error() function stores the errno value in the edx register
before invoking the __set_errno() macro.  When using the pthread library
this macro calls thread_self() to determine the errno location, which might
clobber the edx register.  The errno value must be stored in a "real"
variable so the compiler can take care of saving/restoring it if necessary.

Signed-off-by: Ingo van Lil <inguin at gmx.de>
Signed-off-by: Mike Frysinger <vapier at gentoo.org>
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop at gmail.com>
---
 libc/sysdeps/linux/i386/__syscall_error.c |    7 +++----
 1 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/libc/sysdeps/linux/i386/__syscall_error.c b/libc/sysdeps/linux/i386/__syscall_error.c
index 7509d44..36946bc 100644
--- a/libc/sysdeps/linux/i386/__syscall_error.c
+++ b/libc/sysdeps/linux/i386/__syscall_error.c
@@ -28,9 +28,8 @@
 int __syscall_error(void) attribute_hidden;
 int __syscall_error(void)
 {
-	register int edx __asm__ ("%edx");
-	__asm__ ("mov %eax, %edx\n\t"
-		 "negl %edx");
-	__set_errno (edx);
+	register int eax __asm__ ("%eax");
+	int _errno = -eax;
+	__set_errno (_errno);
 	return -1;
 }
-- 
1.6.3.3



More information about the uClibc-cvs mailing list