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
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}
431d0268c6b855531eedd297f1cb7e4ac5817c9103Brent DeGraaf    .cfi_adjust_cfa_offset 8
445f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .cfi_rel_offset r0, 0
455f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .cfi_rel_offset lr, 4
465f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    push    {r4, r5}
475f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .cfi_adjust_cfa_offset 8
485f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .cfi_rel_offset r4, 0
495f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .cfi_rel_offset r5, 4
505f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
515f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    mov     lr, r2
525f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
535f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // Save the dst register to r5
545f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    mov     r5, r0
555f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
565f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // Zero out r4
575f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    eor     r4, r4, r4
585f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
595f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // r1 contains the address of the string to count.
605f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_strlen_start:
615f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    mov     r0, r1
625f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ands    r3, r1, #7
635f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    beq     .L_mainloop
645f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
655f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // Align to a double word (64 bits).
665f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    rsb     r3, r3, #8
675f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    lsls    ip, r3, #31
685f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    beq     .L_align_to_32
695f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
705f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ldrb    r2, [r1], #1
715f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    cbz     r2, .L_update_count_and_finish
725f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
735f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_align_to_32:
745f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bcc     .L_align_to_64
755f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ands    ip, r3, #2
765f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    beq     .L_align_to_64
775f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
785f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ldrb    r2, [r1], #1
795f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    cbz     r2, .L_update_count_and_finish
805f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ldrb    r2, [r1], #1
815f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    cbz     r2, .L_update_count_and_finish
825f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
835f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_align_to_64:
845f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    tst     r3, #4
855f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    beq     .L_mainloop
865f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ldr     r3, [r1], #4
875f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
885f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     ip, r3, #0x01010101
895f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bic     ip, ip, r3
905f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ands    ip, ip, #0x80808080
915f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bne     .L_zero_in_second_register
925f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
935f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .p2align 2
945f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_mainloop:
955f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ldrd    r2, r3, [r1], #8
965f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
975f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    pld     [r1, #64]
985f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
995f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     ip, r2, #0x01010101
1005f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bic     ip, ip, r2
1015f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ands    ip, ip, #0x80808080
1025f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bne     .L_zero_in_first_register
1035f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1045f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     ip, r3, #0x01010101
1055f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bic     ip, ip, r3
1065f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ands    ip, ip, #0x80808080
1075f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bne     .L_zero_in_second_register
1085f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    b       .L_mainloop
1095f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1105f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_update_count_and_finish:
1115f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     r3, r1, r0
1125f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     r3, r3, #1
1135f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    b       .L_finish
1145f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1155f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_zero_in_first_register:
1165f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     r3, r1, r0
1175f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    lsls    r2, ip, #17
1185f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bne     .L_sub8_and_finish
1195f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bcs     .L_sub7_and_finish
1205f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    lsls    ip, ip, #1
1215f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bne     .L_sub6_and_finish
1225f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1235f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     r3, r3, #5
1245f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    b       .L_finish
1255f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1265f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_sub8_and_finish:
1275f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     r3, r3, #8
1285f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    b       .L_finish
1295f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1305f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_sub7_and_finish:
1315f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     r3, r3, #7
1325f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    b       .L_finish
1335f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1345f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_sub6_and_finish:
1355f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     r3, r3, #6
1365f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    b       .L_finish
1375f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1385f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_zero_in_second_register:
1395f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     r3, r1, r0
1405f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    lsls    r2, ip, #17
1415f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bne     .L_sub4_and_finish
1425f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bcs     .L_sub3_and_finish
1435f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    lsls    ip, ip, #1
1445f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bne     .L_sub2_and_finish
1455f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1465f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     r3, r3, #1
1475f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    b       .L_finish
1485f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1495f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_sub4_and_finish:
1505f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     r3, r3, #4
1515f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    b       .L_finish
1525f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1535f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_sub3_and_finish:
1545f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     r3, r3, #3
1555f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    b       .L_finish
1565f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1575f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_sub2_and_finish:
1585f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    sub     r3, r3, #2
1595f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1605f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_finish:
1615f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    cmp     r4, #0
1625f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bne     .L_strlen_done
1635f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1645f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // Time to get the dst string length.
1655f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    mov     r1, r5
1665f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1675f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // Save the original source address to r5.
1685f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    mov     r5, r0
1695f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1705f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // Save the current length (adding 1 for the terminator).
1715f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    add     r4, r3, #1
1725f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    b       .L_strlen_start
1735f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1745f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // r0 holds the pointer to the dst string.
1755f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // r3 holds the dst string length.
1765f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // r4 holds the src string length + 1.
1775f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris.L_strlen_done:
1785f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    add     r2, r3, r4
1795f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    cmp     r2, lr
1801d0268c6b855531eedd297f1cb7e4ac5817c9103Brent DeGraaf    bhi     .L_strcat_chk_failed
1815f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1825f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    // Set up the registers for the memcpy code.
1835f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    mov     r1, r5
1845f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    pld     [r1, #64]
1855f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    mov     r2, r4
1865f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    add     r0, r0, r3
1875f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    pop     {r4, r5}
1881d0268c6b855531eedd297f1cb7e4ac5817c9103Brent DeGraaf    .cfi_adjust_cfa_offset -8
1891d0268c6b855531eedd297f1cb7e4ac5817c9103Brent DeGraaf    .cfi_restore r4
1901d0268c6b855531eedd297f1cb7e4ac5817c9103Brent DeGraaf    .cfi_restore r5
191a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris
192a57c9c084bc686a35f4f494ce23cf2a9bb3d5d00Christopher Ferris#include "memcpy_base.S"
1935f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
1941d0268c6b855531eedd297f1cb7e4ac5817c9103Brent DeGraaf    // Undo the above cfi directives.
1955f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .cfi_adjust_cfa_offset 8
1965f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .cfi_rel_offset r4, 0
1975f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .cfi_rel_offset r5, 4
1981d0268c6b855531eedd297f1cb7e4ac5817c9103Brent DeGraaf.L_strcat_chk_failed:
1995f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ldr     r0, error_message
2005f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    ldr     r1, error_code
2015f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris1:
2025f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    add     r0, pc
2035f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    bl      __fortify_chk_fail
2045f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferriserror_code:
2055f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .word   BIONIC_EVENT_STRCAT_BUFFER_OVERFLOW
2065f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferriserror_message:
2075f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .word   error_string-(1b+4)
2081d0268c6b855531eedd297f1cb7e4ac5817c9103Brent DeGraafEND(__strcat_chk)
2095f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris
2105f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferris    .data
2115f45d583b0cfb4f7bed1447e8eed003a529cc69eChristopher Ferriserror_string:
21268b67113a44311b3568027af5893e316f63ec556Elliott Hughes    .string "strcat: prevented write past end of buffer"
213