aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAurelien Jarno <aurelien@aurel32.net>2016-03-09 00:25:00 +0100
committerAurelien Jarno <aurelien@aurel32.net>2016-03-09 18:48:18 +0100
commitf8e9c4d30c28b8815e65a391416e8b15d2e7cbb8 (patch)
tree95d48c785692c14ff110106900a16a2d383b80ff
parent613c92b3b59df6a06784cde1d4f410cef0b6da96 (diff)
downloadglibc-f8e9c4d30c28b8815e65a391416e8b15d2e7cbb8.tar
glibc-f8e9c4d30c28b8815e65a391416e8b15d2e7cbb8.tar.gz
glibc-f8e9c4d30c28b8815e65a391416e8b15d2e7cbb8.tar.bz2
glibc-f8e9c4d30c28b8815e65a391416e8b15d2e7cbb8.zip
mips: terminate the FDE before the return trampoline in makecontext
In makecontext the FDE needs to be terminated before the return trampoline otherwise backtrace called within a context created by makecontext yields infinite backtrace. This bug has been present for a long time, stdlib/tst-makecontext did not fail until recent commit e535ce25. Tested on mips-linux-gnu and mips64el-linux-gnuabi64 and mips-linux-gnu, no regression. This fixes stdlib/tst-makecontext on MIPS. Changelog: [BZ #19792] * sysdeps/unix/sysv/linux/mips/makecontext.S (__makecontext): Terminate FDE before return label.
-rw-r--r--ChangeLog6
-rw-r--r--sysdeps/unix/sysv/linux/mips/makecontext.S7
2 files changed, 13 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index a6be76213e..727516e13b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2016-03-09 Aurelien Jarno <aurelien@aurel32.net>
+
+ [BZ #19792]
+ * sysdeps/unix/sysv/linux/mips/makecontext.S (__makecontext):
+ Terminate FDE before return label.
+
2016-03-09 Joseph Myers <joseph@codesourcery.com>
[BZ #19790]
diff --git a/sysdeps/unix/sysv/linux/mips/makecontext.S b/sysdeps/unix/sysv/linux/mips/makecontext.S
index 66600c7513..31965543f8 100644
--- a/sysdeps/unix/sysv/linux/mips/makecontext.S
+++ b/sysdeps/unix/sysv/linux/mips/makecontext.S
@@ -153,6 +153,11 @@ NESTED (__makecontext, FRAMESZ, ra)
#endif
jr ra
+ /* We need to terminate the FDE to stop unwinding if backtrace was
+ called within a context created by makecontext. */
+ cfi_endproc
+ nop
+
99:
#ifdef __PIC__
move gp, s1
@@ -186,6 +191,8 @@ NESTED (__makecontext, FRAMESZ, ra)
1:
lb zero, (zero)
b 1b
+
+ cfi_startproc
PSEUDO_END (__makecontext)
weak_alias (__makecontext, makecontext)