summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--catgets/gencat.c2
-rw-r--r--sysdeps/unix/sysv/linux/i386/setcontext.S53
3 files changed, 31 insertions, 35 deletions
diff --git a/ChangeLog b/ChangeLog
index 49adac16e9..90c7c3d1f9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,15 @@
+2003-04-05 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/unix/sysv/linux/i386/setcontext.S: Rewrite to avoid writing
+ below the stack pointer even if switching to the same context we are
+ running right now.
+
2003-04-05 Ulrich Drepper <drepper@redhat.com>
- * math/test-tgmath.c (F): Initialize c.
+ * catgets/gencat.c (read_input_file): Make sure that \n is not
+ alone on the line before testing for continuation.
+
+ * math/test-tgmath.c (compile_test): Initialize c.
2003-04-05 Alexandre Oliva <aoliva@redhat.com>
diff --git a/catgets/gencat.c b/catgets/gencat.c
index 175f1ffd09..18bf3bbb7f 100644
--- a/catgets/gencat.c
+++ b/catgets/gencat.c
@@ -333,7 +333,7 @@ read_input_file (struct catalog *current, const char *fname)
/* There might be more than one backslash at the end of
the line. Only if there is an odd number of them is
the line continued. */
- if (buf[act_len - 1] == '\\')
+ if (act_len > 0 && buf[act_len - 1] == '\\')
{
int temp_act_len = act_len;
diff --git a/sysdeps/unix/sysv/linux/i386/setcontext.S b/sysdeps/unix/sysv/linux/i386/setcontext.S
index cbe9f08ce5..ebed2ce572 100644
--- a/sysdeps/unix/sysv/linux/i386/setcontext.S
+++ b/sysdeps/unix/sysv/linux/i386/setcontext.S
@@ -1,5 +1,5 @@
/* Install given context.
- Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2001.
@@ -53,39 +53,26 @@ ENTRY(__setcontext)
movl oFS(%eax), %ecx
movw %cx, %fs
+ /* Fetch the address to return to. */
+ movl oEIP(%eax), %ecx
+
/* Load the new stack pointer. */
- movl oESP(%eax), %ecx
- /* Make room for 8 registers and the return address. We will load
- the values from the stack. */
- subl $36, %ecx
-
- /* Move the values of all the 32-bit registers (except ESP) on
- the stack. This happens in the form the 'popa' instruction
- expects it. Before this block put the address of the code
- to execute. */
- movl oEDI(%eax), %ebx
- movl oESI(%eax), %edx
- movl oEBP(%eax), %esi
- movl oEBX(%eax), %edi
- movl %ebx, (%ecx)
- movl %edx, 4(%ecx)
- movl %esi, 8(%ecx)
- movl %edi, 16(%ecx)
- movl oEDX(%eax), %ebx
- movl oECX(%eax), %edx
- movl oEAX(%eax), %esi
- movl oEIP(%eax), %edi
- movl %ebx, 20(%ecx)
- movl %edx, 24(%ecx)
- movl %esi, 28(%ecx)
- movl %edi, 32(%ecx)
-
- /* Set the new stack address. The stack points now to the block
- we put the register content in. */
- movl %ecx, %esp
- /* Restore the register content. */
- popa
- /* The following 'ret' will pop the addres of the code and jump
+ movl oESP(%eax), %esp
+
+ /* Push the return address on the new stack so we can return there. */
+ pushl %ecx
+
+ /* Load the values of all the 32-bit registers (except ESP).
+ Since we are loading from EAX, it must be last. */
+ movl oEDI(%eax), %edi
+ movl oESI(%eax), %esi
+ movl oEBP(%eax), %ebp
+ movl oEBX(%eax), %ebx
+ movl oEDX(%eax), %edx
+ movl oECX(%eax), %ecx
+ movl oEAX(%eax), %eax
+
+ /* The following 'ret' will pop the address of the code and jump
to it. */
L(pseudo_end):