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