about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMarcus Shawcroft <marcus.shawcroft@linaro.org>2013-05-12 18:09:33 +0100
committerMarcus Shawcroft <marcus.shawcroft@linaro.org>2013-05-12 18:09:33 +0100
commitd842b1440dc2adc84387b460d4ed536042dd7322 (patch)
treea98ecf4718b46aa5fa374ffeeaf8f2b184541041
parent601a3a5fd5d2ae7ddef9fb8d742bdef512a7dd0f (diff)
downloadglibc-d842b1440dc2adc84387b460d4ed536042dd7322.tar.gz
glibc-d842b1440dc2adc84387b460d4ed536042dd7322.tar.xz
glibc-d842b1440dc2adc84387b460d4ed536042dd7322.zip
[AArch64] Fix out of range branch from ioctl() and clone()
2013-05-12  Marcus Shawcroft  <marcus.shawcroft@linaro.org>

	* sysdeps/unix/sysv/linux/aarch64/clone.S (__clone):
	Do not call sycall_error directly with a confitional branch.

	* sysdeps/unix/sysv/linux/aarch64/ioctl.S (__ioctl):
	Do not call sycall_error directly with a confitional branch.
-rw-r--r--ports/ChangeLog.aarch648
-rw-r--r--ports/sysdeps/unix/sysv/linux/aarch64/clone.S3
-rw-r--r--ports/sysdeps/unix/sysv/linux/aarch64/ioctl.S4
3 files changed, 11 insertions, 4 deletions
diff --git a/ports/ChangeLog.aarch64 b/ports/ChangeLog.aarch64
index f01388f384..a611ac22cf 100644
--- a/ports/ChangeLog.aarch64
+++ b/ports/ChangeLog.aarch64
@@ -1,3 +1,11 @@
+2013-05-12  Marcus Shawcroft  <marcus.shawcroft@linaro.org>
+
+	* sysdeps/unix/sysv/linux/aarch64/clone.S (__clone):
+	Do not call sycall_error directly with a confitional branch.
+
+	* sysdeps/unix/sysv/linux/aarch64/ioctl.S (__ioctl):
+	Do not call sycall_error directly with a confitional branch.
+
 2013-03-19  Andreas Schwab  <schwab@suse.de>
 
 	* sysdeps/unix/sysv/linux/aarch64/configure.in: Set
diff --git a/ports/sysdeps/unix/sysv/linux/aarch64/clone.S b/ports/sysdeps/unix/sysv/linux/aarch64/clone.S
index 999ecf21ce..b359e6e8a3 100644
--- a/ports/sysdeps/unix/sysv/linux/aarch64/clone.S
+++ b/ports/sysdeps/unix/sysv/linux/aarch64/clone.S
@@ -65,9 +65,10 @@ ENTRY(__clone)
 	svc	0x0
 	cmp	x0, #0
 	beq	2f
-	blt	C_SYMBOL_NAME(__syscall_error)
+	blt	3f
 	RET
 1:	mov	x0, #-EINVAL
+3:
 	b	syscall_error
 
 2:
diff --git a/ports/sysdeps/unix/sysv/linux/aarch64/ioctl.S b/ports/sysdeps/unix/sysv/linux/aarch64/ioctl.S
index b089bb55c5..2e08cf708c 100644
--- a/ports/sysdeps/unix/sysv/linux/aarch64/ioctl.S
+++ b/ports/sysdeps/unix/sysv/linux/aarch64/ioctl.S
@@ -24,9 +24,7 @@ ENTRY(__ioctl)
         sxtw	x0, w0
         svc	#0x0
 	cmn	x0, #0x1, lsl #12
-	b.hi	C_SYMBOL_NAME(__syscall_error)
-	ret
-
+	PSEUDO_RET
 	PSEUDO_END (__ioctl)
 
 weak_alias (__ioctl, ioctl)