.L_strlen_done:
add r2, r3, r4
cmp r2, lr
- bhi .L_strcat_chk_failed
+ itt hi
+ movhi r0, lr
+ bhi __strcat_chk_fail
// Set up the registers for the memcpy code.
mov r1, r5
.cfi_adjust_cfa_offset 8
.cfi_rel_offset r4, 0
.cfi_rel_offset r5, 4
-.L_strcat_chk_failed:
- ldr r0, error_message
-1:
- add r0, pc
- bl __fortify_fatal
-error_message:
- .word error_string-(1b+4)
END(__strcat_chk)
-
- .data
-error_string:
- .string "strcat: prevented write past end of buffer"
.L_strlen_done:
add r2, r3, r4
cmp r2, lr
+ itt hi
+ movhi r0, lr
bhi __strcat_chk_fail
// Set up the registers for the memcpy code.
#define MEMCPY_BASE __strcat_chk_memcpy_base
#define MEMCPY_BASE_ALIGNED __strcat_chk_memcpy_base_aligned
#include "memcpy_base.S"
-
-ENTRY_PRIVATE(__strcat_chk_fail)
- .cfi_def_cfa_offset 8
- .cfi_rel_offset r0, 0
- .cfi_rel_offset lr, 4
- .cfi_adjust_cfa_offset 8
- .cfi_rel_offset r4, 0
- .cfi_rel_offset r5, 4
-
- ldr r0, error_message
-1:
- add r0, pc
- bl __fortify_fatal
-error_message:
- .word error_string-(1b+4)
-END(__strcat_chk_fail)
-
- .data
-error_string:
- .string "strcat: prevented write past end of buffer"
.L_strlen_done:
add r2, r3, r4
cmp r2, lr
- bhi __strcat_chk_failed
+ itt hi
+ movhi r0, lr
+ bhi __strcat_chk_fail
// Set up the registers for the memcpy code.
mov r1, r5
#define MEMCPY_BASE_ALIGNED __strcat_chk_memcpy_base_aligned
#include "memcpy_base.S"
-
-ENTRY_PRIVATE(__strcat_chk_failed)
- .cfi_def_cfa_offset 8
- .cfi_rel_offset r0, 0
- .cfi_rel_offset lr, 4
- .cfi_adjust_cfa_offset 8
- .cfi_rel_offset r4, 0
- .cfi_rel_offset r5, 4
-
- ldr r0, error_message
-1:
- add r0, pc
- bl __fortify_fatal
-error_message:
- .word error_string-(1b+4)
-END(__strcat_chk_failed)
-
- .data
-error_string:
- .string "strcat: prevented write past end of buffer"
.L_strlen_done:
add r2, r3, r4
cmp r2, lr
- bhi .L_strcat_chk_failed
+ itt hi
+ movhi r0, lr
+ bhi __strcat_chk_fail
// Set up the registers for the memcpy code.
mov r1, r5
.cfi_adjust_cfa_offset 8
.cfi_rel_offset r4, 0
.cfi_rel_offset r5, 4
-.L_strcat_chk_failed:
- ldr r0, error_message
-1:
- add r0, pc
- bl __fortify_fatal
-error_message:
- .word error_string-(1b+4)
END(__strcat_chk)
-
- .data
-error_string:
- .string "strcat: prevented write past end of buffer"
return dst;
}
+// strcat is performance-critical enough that we have assembler __strcat_chk implementations.
+// This function is used to give better diagnostics than we can easily do from assembler.
+extern "C" void __strcat_chk_fail(size_t dst_buf_size) {
+ __fortify_fatal("strcat: prevented write past end of %zu-byte buffer", dst_buf_size);
+}
+
char* __strchr_chk(const char* p, int ch, size_t s_len) {
for (;; ++p, s_len--) {
if (__predict_false(s_len == 0)) {