Improve diagnostics from the assembler __memset_chk routines.
Change-Id: Ic165043ab8cd5e16866b3e11cfba960514cbdc57
diff --git a/libc/arch-arm/cortex-a15/bionic/memset.S b/libc/arch-arm/cortex-a15/bionic/memset.S
index 6941150..732a039 100644
--- a/libc/arch-arm/cortex-a15/bionic/memset.S
+++ b/libc/arch-arm/cortex-a15/bionic/memset.S
@@ -47,12 +47,7 @@
.cfi_def_cfa_offset 4
.cfi_rel_offset lr, 0
- ldr r0, error_message
-1:
- add r0, pc
- bl __fortify_fatal
-error_message:
- .word error_string-(1b+8)
+ bl __memset_chk_fail
END(__memset_chk)
ENTRY(bzero)
@@ -181,7 +176,3 @@
ldmfd sp!, {r0}
bx lr
END(memset)
-
- .data
-error_string:
- .string "memset: prevented write past end of buffer"
diff --git a/libc/arch-arm/cortex-a7/bionic/memset.S b/libc/arch-arm/cortex-a7/bionic/memset.S
index 8e69bbc..0b96d62 100644
--- a/libc/arch-arm/cortex-a7/bionic/memset.S
+++ b/libc/arch-arm/cortex-a7/bionic/memset.S
@@ -47,12 +47,7 @@
.cfi_def_cfa_offset 4
.cfi_rel_offset lr, 0
- ldr r0, error_message
-1:
- add r0, pc
- bl __fortify_fatal
-error_message:
- .word error_string-(1b+8)
+ bl __memset_chk_fail
END(__memset_chk)
ENTRY(bzero)
@@ -170,7 +165,3 @@
strbcs r1, [r3], #1
bx lr
END(memset)
-
- .data
-error_string:
- .string "memset: prevented write past end of buffer"
diff --git a/libc/arch-arm/cortex-a9/bionic/memset.S b/libc/arch-arm/cortex-a9/bionic/memset.S
index 918a4ad..a2c8110 100644
--- a/libc/arch-arm/cortex-a9/bionic/memset.S
+++ b/libc/arch-arm/cortex-a9/bionic/memset.S
@@ -45,12 +45,7 @@
.cfi_def_cfa_offset 4
.cfi_rel_offset lr, 0
- ldr r0, error_message
-1:
- add r0, pc
- bl __fortify_fatal
-error_message:
- .word error_string-(1b+8)
+ bl __memset_chk_fail
END(__memset_chk)
ENTRY(bzero)
@@ -172,7 +167,3 @@
strbcs r1, [r0]
ldmfd sp!, {r0, r4-r7, pc}
END(memset)
-
- .data
-error_string:
- .string "memset: prevented write past end of buffer"
diff --git a/libc/arch-arm/denver/bionic/memset.S b/libc/arch-arm/denver/bionic/memset.S
index 6fac194..8d79e5b 100644
--- a/libc/arch-arm/denver/bionic/memset.S
+++ b/libc/arch-arm/denver/bionic/memset.S
@@ -49,13 +49,7 @@
.cfi_def_cfa_offset 4
.cfi_rel_offset lr, 0
-
- ldr r0, error_message
-1:
- add r0, pc
- bl __fortify_fatal
-error_message:
- .word error_string-(1b+8)
+ bl __memset_chk_fail
END(__memset_chk)
ENTRY(bzero)
@@ -198,7 +192,3 @@
2:
bx lr
END(memset)
-
- .data
-error_string:
- .string "memset: prevented write past end of buffer"
diff --git a/libc/arch-arm/generic/bionic/memset.S b/libc/arch-arm/generic/bionic/memset.S
index 452b9d4..6e70397 100644
--- a/libc/arch-arm/generic/bionic/memset.S
+++ b/libc/arch-arm/generic/bionic/memset.S
@@ -40,13 +40,7 @@
cmp r2, r3
bls done
- ldr r0, error_message
-1:
- add r0, pc
- bl __fortify_fatal
-error_message:
- .word error_string-(1b+8)
-
+ bl __memset_chk_fail
END(__memset_chk)
ENTRY(bzero)
@@ -123,7 +117,3 @@
strbcs r1, [r0]
ldmfd sp!, {r0, r4-r7, pc}
END(memset)
-
- .data
-error_string:
- .string "memset: prevented write past end of buffer"
diff --git a/libc/arch-arm/krait/bionic/memset.S b/libc/arch-arm/krait/bionic/memset.S
index 6b6d29c..0264dd3 100644
--- a/libc/arch-arm/krait/bionic/memset.S
+++ b/libc/arch-arm/krait/bionic/memset.S
@@ -47,12 +47,7 @@
.cfi_def_cfa_offset 4
.cfi_rel_offset lr, 0
- ldr r0, error_message
-1:
- add r0, pc
- bl __fortify_fatal
-error_message:
- .word error_string-(1b+8)
+ bl __memset_chk_fail
END(__memset_chk)
ENTRY(bzero)
@@ -97,7 +92,3 @@
strbcs r1, [r3], #1
bx lr
END(memset)
-
- .data
-error_string:
- .string "memset: prevented write past end of buffer"
diff --git a/libc/bionic/fortify.cpp b/libc/bionic/fortify.cpp
index f68efab..1b9f951 100644
--- a/libc/bionic/fortify.cpp
+++ b/libc/bionic/fortify.cpp
@@ -145,6 +145,14 @@
return memrchr(s, c, n);
}
+// memset is performance-critical enough that we have assembler __memset_chk implementations.
+// This function is used to give better diagnostics than we can easily do from assembler.
+extern "C" void* __memset_chk_fail(void* /*dst*/, int /*byte*/, size_t count, size_t dst_len) {
+ __check_count("memset", "count", count);
+ __check_buffer_access("memset", "write into", count, dst_len);
+ abort(); // One of the above is supposed to have failed, otherwise we shouldn't have been called.
+}
+
int __poll_chk(pollfd* fds, nfds_t fd_count, int timeout, size_t fds_size) {
__check_pollfd_array("poll", fds_size, fd_count);
return poll(fds, fd_count, timeout);