summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorjvoisin2024-04-24 17:09:08 +0200
committerjvoisin2024-04-24 17:14:46 +0200
commita817e1555a755224cacc1cbdeeaefb6a1de606f0 (patch)
treebfe86af6c7e7af91859eb36ec2e02056263f8827 /include
parent265fa03fa0c467c9c41d803ebe2a538e758cba20 (diff)
Fix some overlap mismatch
This was caught by the following test: ``` int main(void) { char c[32]; memcpy(c, c + 16, 16); } ``` Reported-by: q66
Diffstat (limited to 'include')
-rw-r--r--include/fortify-headers.h4
-rw-r--r--include/string.h8
2 files changed, 5 insertions, 7 deletions
diff --git a/include/fortify-headers.h b/include/fortify-headers.h
index ea2e430..796fd2d 100644
--- a/include/fortify-headers.h
+++ b/include/fortify-headers.h
@@ -141,8 +141,8 @@
141 * since gcc seems to like to generate code that relies on dst == src */ 141 * since gcc seems to like to generate code that relies on dst == src */
142#define __fh_overlap(a, len_a, b, len_b) \ 142#define __fh_overlap(a, len_a, b, len_b) \
143 ( \ 143 ( \
144 ((a) < (b) && (b) < (a) + (__fh_size_t)(len_a)) \ 144 ((a) < (b) && (b) < ((a) + (__fh_size_t)(len_a))) \
145 || ((b) < (a) && (a) < (b) + (__fh_size_t)(len_b)) \ 145 || ((b) < (a) && (a) < ((b) + (__fh_size_t)(len_b))) \
146 ) 146 )
147 147
148/* 148/*
diff --git a/include/string.h b/include/string.h
index 071d592..924be49 100644
--- a/include/string.h
+++ b/include/string.h
@@ -58,10 +58,8 @@ __error_if((__fh_bos(__od, 0) < __n), "'memcpy' called with `n` bigger than the
58 58
59 __fh_size_t __bd = __fh_bos(__od, 0); 59 __fh_size_t __bd = __fh_bos(__od, 0);
60 __fh_size_t __bs = __fh_bos(__os, 0); 60 __fh_size_t __bs = __fh_bos(__os, 0);
61 char *__d = (char *)__od;
62 const char *__s = (const char *)__os;
63 61
64 if __fh_overlap(__d, __bd, __s, __n) 62 if __fh_overlap(__od, __n, __os, __n)
65 __builtin_trap(); 63 __builtin_trap();
66 if (__n > __bd || __n > __bs) 64 if (__n > __bd || __n > __bs)
67 __builtin_trap(); 65 __builtin_trap();
@@ -189,7 +187,7 @@ _FORTIFY_FN(stpcpy) char *stpcpy(char * _FORTIFY_POS0 __d, const char *__s)
189 __fh_size_t __n = strlen(__s) + 1; 187 __fh_size_t __n = strlen(__s) + 1;
190 __fh_size_t __b = __fh_bos(__d, 0); 188 __fh_size_t __b = __fh_bos(__d, 0);
191 189
192 if (__fh_overlap(__d, __b, __s, __n)) 190 if (__fh_overlap(__d, __n, __s, __n))
193 __builtin_trap(); 191 __builtin_trap();
194 192
195 if (__n > __b) 193 if (__n > __b)
@@ -257,7 +255,7 @@ _FORTIFY_FN(strcpy) char *strcpy(char * _FORTIFY_POS0 __d, const char *__s)
257 __fh_size_t __n = strlen(__s) + 1; 255 __fh_size_t __n = strlen(__s) + 1;
258 __fh_size_t __b = __fh_bos(__d, 0); 256 __fh_size_t __b = __fh_bos(__d, 0);
259 257
260 if (__fh_overlap(__d, __b, __s, __n)) 258 if (__fh_overlap(__d, __n, __s, __n))
261 __builtin_trap(); 259 __builtin_trap();
262 260
263 if (__n > __b) 261 if (__n > __b)