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);