4
4
5
5
#include <linux/const.h>
6
6
7
- #define __FORTIFY_INLINE extern __always_inline __gnu_inline
7
+ #define __FORTIFY_INLINE extern __always_inline __gnu_inline __overloadable
8
8
#define __RENAME (x ) __asm__(#x)
9
9
10
10
void fortify_panic (const char * name ) __noreturn __cold ;
@@ -52,8 +52,17 @@ extern char *__underlying_strncpy(char *p, const char *q, __kernel_size_t size)
52
52
#define __underlying_strncpy __builtin_strncpy
53
53
#endif
54
54
55
+ /*
56
+ * Clang's use of __builtin_object_size() within inlines needs hinting via
57
+ * __pass_object_size(). The preference is to only ever use type 1 (member
58
+ * size, rather than struct size), but there remain some stragglers using
59
+ * type 0 that will be converted in the future.
60
+ */
61
+ #define POS __pass_object_size(1)
62
+ #define POS0 __pass_object_size(0)
63
+
55
64
__FORTIFY_INLINE __diagnose_as (__builtin_strncpy , 1 , 2 , 3 )
56
- char * strncpy (char * const p , const char * q , __kernel_size_t size )
65
+ char * strncpy (char * const POS p , const char * q , __kernel_size_t size )
57
66
{
58
67
size_t p_size = __builtin_object_size (p , 1 );
59
68
@@ -65,7 +74,7 @@ char *strncpy(char * const p, const char *q, __kernel_size_t size)
65
74
}
66
75
67
76
__FORTIFY_INLINE __diagnose_as (__builtin_strcat , 1 , 2 )
68
- char * strcat (char * const p , const char * q )
77
+ char * strcat (char * const POS p , const char * q )
69
78
{
70
79
size_t p_size = __builtin_object_size (p , 1 );
71
80
@@ -77,7 +86,7 @@ char *strcat(char * const p, const char *q)
77
86
}
78
87
79
88
extern __kernel_size_t __real_strnlen (const char * , __kernel_size_t ) __RENAME (strnlen );
80
- __FORTIFY_INLINE __kernel_size_t strnlen (const char * const p , __kernel_size_t maxlen )
89
+ __FORTIFY_INLINE __kernel_size_t strnlen (const char * const POS p , __kernel_size_t maxlen )
81
90
{
82
91
size_t p_size = __builtin_object_size (p , 1 );
83
92
size_t p_len = __compiletime_strlen (p );
@@ -106,7 +115,7 @@ __FORTIFY_INLINE __kernel_size_t strnlen(const char * const p, __kernel_size_t m
106
115
__builtin_choose_expr(__is_constexpr(__builtin_strlen(p)), \
107
116
__builtin_strlen(p), __fortify_strlen(p))
108
117
__FORTIFY_INLINE __diagnose_as (__builtin_strlen , 1 )
109
- __kernel_size_t __fortify_strlen (const char * const p )
118
+ __kernel_size_t __fortify_strlen (const char * const POS p )
110
119
{
111
120
__kernel_size_t ret ;
112
121
size_t p_size = __builtin_object_size (p , 1 );
@@ -122,7 +131,7 @@ __kernel_size_t __fortify_strlen(const char * const p)
122
131
123
132
/* defined after fortified strlen to reuse it */
124
133
extern size_t __real_strlcpy (char * , const char * , size_t ) __RENAME (strlcpy );
125
- __FORTIFY_INLINE size_t strlcpy (char * const p , const char * const q , size_t size )
134
+ __FORTIFY_INLINE size_t strlcpy (char * const POS p , const char * const POS q , size_t size )
126
135
{
127
136
size_t p_size = __builtin_object_size (p , 1 );
128
137
size_t q_size = __builtin_object_size (q , 1 );
@@ -149,7 +158,7 @@ __FORTIFY_INLINE size_t strlcpy(char * const p, const char * const q, size_t siz
149
158
150
159
/* defined after fortified strnlen to reuse it */
151
160
extern ssize_t __real_strscpy (char * , const char * , size_t ) __RENAME (strscpy );
152
- __FORTIFY_INLINE ssize_t strscpy (char * const p , const char * const q , size_t size )
161
+ __FORTIFY_INLINE ssize_t strscpy (char * const POS p , const char * const POS q , size_t size )
153
162
{
154
163
size_t len ;
155
164
/* Use string size rather than possible enclosing struct size. */
@@ -196,7 +205,7 @@ __FORTIFY_INLINE ssize_t strscpy(char * const p, const char * const q, size_t si
196
205
197
206
/* defined after fortified strlen and strnlen to reuse them */
198
207
__FORTIFY_INLINE __diagnose_as (__builtin_strncat , 1 , 2 , 3 )
199
- char * strncat (char * const p , const char * const q , __kernel_size_t count )
208
+ char * strncat (char * const POS p , const char * const POS q , __kernel_size_t count )
200
209
{
201
210
size_t p_len , copy_len ;
202
211
size_t p_size = __builtin_object_size (p , 1 );
@@ -367,7 +376,7 @@ __FORTIFY_INLINE void fortify_memcpy_chk(__kernel_size_t size,
367
376
memmove)
368
377
369
378
extern void * __real_memscan (void * , int , __kernel_size_t ) __RENAME (memscan );
370
- __FORTIFY_INLINE void * memscan (void * const p , int c , __kernel_size_t size )
379
+ __FORTIFY_INLINE void * memscan (void * const POS0 p , int c , __kernel_size_t size )
371
380
{
372
381
size_t p_size = __builtin_object_size (p , 0 );
373
382
@@ -379,7 +388,7 @@ __FORTIFY_INLINE void *memscan(void * const p, int c, __kernel_size_t size)
379
388
}
380
389
381
390
__FORTIFY_INLINE __diagnose_as (__builtin_memcmp , 1 , 2 , 3 )
382
- int memcmp (const void * const p , const void * const q , __kernel_size_t size )
391
+ int memcmp (const void * const POS0 p , const void * const POS0 q , __kernel_size_t size )
383
392
{
384
393
size_t p_size = __builtin_object_size (p , 0 );
385
394
size_t q_size = __builtin_object_size (q , 0 );
@@ -396,7 +405,7 @@ int memcmp(const void * const p, const void * const q, __kernel_size_t size)
396
405
}
397
406
398
407
__FORTIFY_INLINE __diagnose_as (__builtin_memchr , 1 , 2 , 3 )
399
- void * memchr (const void * const p , int c , __kernel_size_t size )
408
+ void * memchr (const void * const POS0 p , int c , __kernel_size_t size )
400
409
{
401
410
size_t p_size = __builtin_object_size (p , 0 );
402
411
@@ -408,7 +417,7 @@ void *memchr(const void * const p, int c, __kernel_size_t size)
408
417
}
409
418
410
419
void * __real_memchr_inv (const void * s , int c , size_t n ) __RENAME (memchr_inv );
411
- __FORTIFY_INLINE void * memchr_inv (const void * const p , int c , size_t size )
420
+ __FORTIFY_INLINE void * memchr_inv (const void * const POS0 p , int c , size_t size )
412
421
{
413
422
size_t p_size = __builtin_object_size (p , 0 );
414
423
@@ -420,7 +429,7 @@ __FORTIFY_INLINE void *memchr_inv(const void * const p, int c, size_t size)
420
429
}
421
430
422
431
extern void * __real_kmemdup (const void * src , size_t len , gfp_t gfp ) __RENAME (kmemdup );
423
- __FORTIFY_INLINE void * kmemdup (const void * const p , size_t size , gfp_t gfp )
432
+ __FORTIFY_INLINE void * kmemdup (const void * const POS0 p , size_t size , gfp_t gfp )
424
433
{
425
434
size_t p_size = __builtin_object_size (p , 0 );
426
435
@@ -433,7 +442,7 @@ __FORTIFY_INLINE void *kmemdup(const void * const p, size_t size, gfp_t gfp)
433
442
434
443
/* Defined after fortified strlen to reuse it. */
435
444
__FORTIFY_INLINE __diagnose_as (__builtin_strcpy , 1 , 2 )
436
- char * strcpy (char * const p , const char * const q )
445
+ char * strcpy (char * const POS p , const char * const POS q )
437
446
{
438
447
size_t p_size = __builtin_object_size (p , 1 );
439
448
size_t q_size = __builtin_object_size (q , 1 );
@@ -462,4 +471,7 @@ char *strcpy(char * const p, const char * const q)
462
471
#undef __underlying_strncat
463
472
#undef __underlying_strncpy
464
473
474
+ #undef POS
475
+ #undef POS0
476
+
465
477
#endif /* _LINUX_FORTIFY_STRING_H_ */
0 commit comments