fortify-headers

standalone fortify-source implementation
git clone git://git.2f30.org/fortify-headers
Log | Files | Refs | README | LICENSE

commit ae6576eada328e1b7d0ba42b35e157c0aaa38299
parent 4a26785c0cab4686e5825fe5f5e921d12e7142b7
Author: jvoisin <julien.voisin@dustri.org>
Date:   Fri, 31 Oct 2025 21:05:58 +0100

Add some NULL-pointers checks

See:
- https://www.imperialviolet.org/2016/06/26/nonnull.html
- https://davidben.net/2024/01/15/empty-slices.html

Diffstat:
Minclude/string.h | 12++++++++++++
1 file changed, 12 insertions(+), 0 deletions(-)

diff --git a/include/string.h b/include/string.h @@ -45,6 +45,9 @@ _FORTIFY_FN(memcpy) void *memcpy(void * _FORTIFY_POS0 __od, char *__d = (char *)__od; const char *__s = (const char *)__os; + if (!__od || !__os) + __builtin_trap(); + /* 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) || @@ -61,6 +64,9 @@ _FORTIFY_FN(memmove) void *memmove(void * _FORTIFY_POS0 __d, size_t __bd = __bos(__d, 0); size_t __bs = __bos(__s, 0); + if (!__d || !__s) + __builtin_trap(); + if (__n > __bd || __n > __bs) __builtin_trap(); return __orig_memmove(__d, __s, __n); @@ -70,6 +76,9 @@ _FORTIFY_FN(memset) void *memset(void * _FORTIFY_POS0 __d, int __c, size_t __n) { size_t __b = __bos(__d, 0); + if (!__d) + __builtin_trap(); + if (__n > __b) __builtin_trap(); return __builtin_memset(__d, __c, __n); @@ -153,6 +162,9 @@ _FORTIFY_FN(mempcpy) void *mempcpy(void * _FORTIFY_POS0 __d, size_t __bd = __bos(__d, 0); size_t __bs = __bos(__s, 0); + if (!__d || !__s) + __builtin_trap(); + if (__n > __bd || __n > __bs) __builtin_trap(); return __orig_mempcpy(__d, __s, __n);