15f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris/* 25f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * Copyright (C) 2013 The Android Open Source Project 35f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * All rights reserved. 45f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * 55f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * Redistribution and use in source and binary forms, with or without 65f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * modification, are permitted provided that the following conditions 75f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * are met: 85f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * * Redistributions of source code must retain the above copyright 95f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * notice, this list of conditions and the following disclaimer. 105f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * * Redistributions in binary form must reproduce the above copyright 115f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * notice, this list of conditions and the following disclaimer in 125f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * the documentation and/or other materials provided with the 135f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * distribution. 145f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * 155f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 165f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 175f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 185f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 195f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 205f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 215f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 225f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 235f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 245f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 255f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 265f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris * SUCH DAMAGE. 275f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris */ 285f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 29851e68a2402fa414544e66650e09dfdaac813e51Elliott Hughes#include <private/bionic_asm.h> 30851e68a2402fa414544e66650e09dfdaac813e51Elliott Hughes#include <private/libc_events.h> 315f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 325f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris .syntax unified 335f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris .fpu neon 345f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris .thumb 355f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris .thumb_func 365f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 375f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris// Get the length of src string, then get the source of the dst string. 385f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris// Check that the two lengths together don't exceed the threshold, then 395f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris// do a memcpy of the data. 405f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher FerrisENTRY(__strcat_chk) 415f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris pld [r0, #0] 425f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris push {r0, lr} 43a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris .save {r0, lr} 445f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris .cfi_def_cfa_offset 8 455f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris .cfi_rel_offset r0, 0 465f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris .cfi_rel_offset lr, 4 475f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris push {r4, r5} 48a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris .save {r4, r5} 495f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris .cfi_adjust_cfa_offset 8 505f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris .cfi_rel_offset r4, 0 515f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris .cfi_rel_offset r5, 4 525f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 535f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris mov lr, r2 545f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 555f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris // Save the dst register to r5 565f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris mov r5, r0 575f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 585f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris // Zero out r4 595f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris eor r4, r4, r4 605f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 615f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris // r1 contains the address of the string to count. 625f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_strlen_start: 635f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris mov r0, r1 645f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 655f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris ands r3, r0, #7 665f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris bne .L_align_src 675f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 685f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris .p2align 2 695f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_mainloop: 705f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris ldmia r1!, {r2, r3} 715f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 725f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris pld [r1, #64] 735f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 745f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris sub ip, r2, #0x01010101 755f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris bic ip, ip, r2 765f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris ands ip, ip, #0x80808080 775f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris bne .L_zero_in_first_register 785f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 795f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris sub ip, r3, #0x01010101 805f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris bic ip, ip, r3 815f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris ands ip, ip, #0x80808080 825f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris bne .L_zero_in_second_register 835f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris b .L_mainloop 845f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 855f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_zero_in_first_register: 865f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris sub r3, r1, r0 875f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris // Check for zero in byte 0. 885f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris lsls r2, ip, #17 895f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris beq .L_check_byte1_reg1 905f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 915f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris sub r3, r3, #8 925f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris b .L_finish 935f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 945f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_check_byte1_reg1: 955f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris bcc .L_check_byte2_reg1 965f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 975f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris sub r3, r3, #7 985f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris b .L_finish 995f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 1005f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_check_byte2_reg1: 1015f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris // Check for zero in byte 2. 1025f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris tst ip, #0x800000 1035f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris it ne 1045f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris subne r3, r3, #6 1055f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris bne .L_finish 1065f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris sub r3, r3, #5 1075f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris b .L_finish 1085f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 1095f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_zero_in_second_register: 1105f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris sub r3, r1, r0 1115f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris // Check for zero in byte 0. 1125f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris lsls r2, ip, #17 1135f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris beq .L_check_byte1_reg2 1145f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 1155f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris sub r3, r3, #4 1165f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris b .L_finish 1175f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 1185f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_check_byte1_reg2: 1195f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris bcc .L_check_byte2_reg2 1205f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 1215f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris sub r3, r3, #3 1225f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris b .L_finish 1235f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 1245f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_check_byte2_reg2: 1255f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris // Check for zero in byte 2. 1265f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris tst ip, #0x800000 1275f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris it ne 1285f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris subne r3, r3, #2 1295f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris bne .L_finish 1305f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris sub r3, r3, #1 1315f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris b .L_finish 1325f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 1335f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_align_src: 1345f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris // Align to a double word (64 bits). 1355f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris rsb r3, r3, #8 1365f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris lsls ip, r3, #31 1375f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris beq .L_align_to_32 1385f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 1395f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris ldrb r2, [r1], #1 1405f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris cbz r2, .L_done 1415f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 1425f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_align_to_32: 1435f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris bcc .L_align_to_64 1445f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 1455f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris ldrb r2, [r1], #1 1465f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris cbz r2, .L_done 1475f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris ldrb r2, [r1], #1 1485f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris cbz r2, .L_done 1495f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 1505f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_align_to_64: 1515f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris tst r3, #4 1525f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris beq .L_mainloop 1535f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris ldr r2, [r1], #4 1545f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 1555f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris sub ip, r2, #0x01010101 1565f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris bic ip, ip, r2 1575f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris ands ip, ip, #0x80808080 1585f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris bne .L_zero_in_second_register 1595f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris b .L_mainloop 1605f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 1615f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_done: 1625f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris sub r3, r1, r0 1635f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris sub r3, r3, #1 1645f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 1655f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_finish: 1665f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris cmp r4, #0 1675f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris bne .L_strlen_done 1685f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 1695f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris // Time to get the dst string length. 1705f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris mov r1, r5 1715f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 1725f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris // Save the original source address to r5. 1735f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris mov r5, r0 1745f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 1755f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris // Save the current length (adding 1 for the terminator). 1765f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris add r4, r3, #1 1775f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris b .L_strlen_start 1785f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 1795f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris // r0 holds the pointer to the dst string. 1805f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris // r3 holds the dst string length. 1815f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris // r4 holds the src string length + 1. 1825f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_strlen_done: 1835f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris add r2, r3, r4 1845f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris cmp r2, lr 18516e185c9081530859c17270fbaf5798f0ea871f8Christopher Ferris bhi __strcat_chk_fail 1865f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 1875f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris // Set up the registers for the memcpy code. 1885f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris mov r1, r5 1895f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris pld [r1, #64] 1905f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris mov r2, r4 1915f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris add r0, r0, r3 1925f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris pop {r4, r5} 1935f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 194a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris // Fall through into the memcpy_base function. 195a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher FerrisEND(__strcat_chk) 1965f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 197a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris#define MEMCPY_BASE __strcat_chk_memcpy_base 198a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris#define MEMCPY_BASE_ALIGNED __strcat_chk_memcpy_base_aligned 199a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris#include "memcpy_base.S" 200a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris 20132bbf8a63bb43a540cc0f1dd5037736d10b70e0bNick KralevichENTRY_PRIVATE(__strcat_chk_fail) 202a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris .save {r0, lr} 203a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris .save {r4, r5} 204a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris .cfi_def_cfa_offset 8 205a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris .cfi_rel_offset r0, 0 206a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris .cfi_rel_offset lr, 4 2075f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris .cfi_adjust_cfa_offset 8 2085f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris .cfi_rel_offset r4, 0 2095f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris .cfi_rel_offset r5, 4 2105f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 2115f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris ldr r0, error_message 2125f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris ldr r1, error_code 2135f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris1: 2145f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris add r0, pc 2155f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris bl __fortify_chk_fail 2165f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferriserror_code: 2175f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris .word BIONIC_EVENT_STRCAT_BUFFER_OVERFLOW 2185f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferriserror_message: 2195f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris .word error_string-(1b+4) 220a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher FerrisEND(__strcat_chk_fail) 2215f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris 2225f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris .data 2235f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferriserror_string: 22468b67113a44311b3568027af5893e316f63ec556Elliott Hughes .string "strcat: prevented write past end of buffer" 225