about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@suse.de>2017-01-18 12:56:41 -0800
committerStan Shebs <stanshebs@google.com>2017-01-18 12:56:41 -0800
commite1c67173bfead6f83584f5042947591d731a06a5 (patch)
tree85159c08f219e9e40c00cb0f92a6c9e88490ea10
parentd701c3a0a506fa48855b91e511eb6e9348d634da (diff)
downloadglibc-e1c67173bfead6f83584f5042947591d731a06a5.tar.gz
glibc-e1c67173bfead6f83584f5042947591d731a06a5.tar.xz
glibc-e1c67173bfead6f83584f5042947591d731a06a5.zip
Missing unwind info in __startcontext causes infinite loop (BZ20435, CVE-2016-6323)
-rw-r--r--README.google5
-rw-r--r--ports/sysdeps/unix/sysv/linux/arm/setcontext.S7
2 files changed, 12 insertions, 0 deletions
diff --git a/README.google b/README.google
index fef32de1c4..943deec446 100644
--- a/README.google
+++ b/README.google
@@ -657,3 +657,8 @@ catgets/tst-catgets.c
   Fix catopen() Multiple unbounded stack allocations (BZ17905, CVE-2015-8779)
   https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=0f58539030e436449f79189b6edab17d7479796e
   (stanshebs, backport)
+
+ports/sysdeps/unix/sysv/linux/arm/setcontext.S
+  Missing unwind info in __startcontext causes infinite loop (BZ20435, CVE-2016-6323)
+  https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=9e2ff6c9cc54c0b4402b8d49e4abe7000fde7617
+  (stanshebs, backport)
diff --git a/ports/sysdeps/unix/sysv/linux/arm/setcontext.S b/ports/sysdeps/unix/sysv/linux/arm/setcontext.S
index 7b9b511b80..7da16a95c2 100644
--- a/ports/sysdeps/unix/sysv/linux/arm/setcontext.S
+++ b/ports/sysdeps/unix/sysv/linux/arm/setcontext.S
@@ -86,12 +86,19 @@ weak_alias(__setcontext, setcontext)
 
 	/* Called when a makecontext() context returns.  Start the
 	   context in R4 or fall through to exit().  */
+	/* Unwind descriptors are looked up based on PC - 2, so we have to
+	   make sure to mark the instruction preceding the __startcontext
+	   label as .cantunwind.  */
+	.fnstart
+	.cantunwind
+	nop
 ENTRY(__startcontext)
 	movs    r0, r4
 	bne     PLTJMP(__setcontext)
 
 	@ New context was 0 - exit
 	b       PLTJMP(HIDDEN_JUMPTARGET(_exit))
+	.fnend
 END(__startcontext)
 
 #ifdef PIC