From 1ace027335c9ca0ae400958aded936d04505ec86 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Tue, 30 May 2023 20:46:14 +0200 Subject: Add a check for overlapping copies in strcpy --- include/string.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'include/string.h') diff --git a/include/string.h b/include/string.h index f08eb4c..8685bb7 100644 --- a/include/string.h +++ b/include/string.h @@ -107,8 +107,15 @@ _FORTIFY_FN(strcat) char *strcat(char *__d, const char *__s) _FORTIFY_FN(strcpy) char *strcpy(char *__d, const char *__s) { - size_t __b = __bos(__d, 0); + size_t __n = strlen(__s) + 1; + + /* trap if pointers are overlapping but not if dst == src. + * gcc seems to like to generate code that relies on dst == src */ + if ((__d < __s && __d + __n > __s) || + (__s < __d && __s + __n > __d)) + __builtin_trap(); + size_t __b = __bos(__d, 0); if (strlen(__s) + 1 > __b) __builtin_trap(); return __orig_strcpy(__d, __s); -- cgit v1.3