@@ -20,7 +20,7 @@ void __write_overflow_field(size_t avail, size_t wanted) __compiletime_warning("
20
20
({ \
21
21
unsigned char *__p = (unsigned char *)(p); \
22
22
size_t __ret = SIZE_MAX; \
23
- size_t __p_size = __builtin_object_size(p, 1); \
23
+ size_t __p_size = __member_size(p); \
24
24
if (__p_size != SIZE_MAX && \
25
25
__builtin_constant_p(*__p)) { \
26
26
size_t __p_len = __p_size - 1; \
@@ -72,13 +72,15 @@ extern char *__underlying_strncpy(char *p, const char *q, __kernel_size_t size)
72
72
__underlying_memcpy(dst, src, bytes)
73
73
74
74
/*
75
- * Clang's use of __builtin_object_size () within inlines needs hinting via
76
- * __pass_object_size (). The preference is to only ever use type 1 (member
75
+ * Clang's use of __builtin_*object_size () within inlines needs hinting via
76
+ * __pass_*object_size (). The preference is to only ever use type 1 (member
77
77
* size, rather than struct size), but there remain some stragglers using
78
78
* type 0 that will be converted in the future.
79
79
*/
80
- #define POS __pass_object_size(1)
81
- #define POS0 __pass_object_size(0)
80
+ #define POS __pass_object_size(1)
81
+ #define POS0 __pass_object_size(0)
82
+ #define __struct_size (p ) __builtin_object_size(p, 0)
83
+ #define __member_size (p ) __builtin_object_size(p, 1)
82
84
83
85
#define __compiletime_lessthan (bounds , length ) ( \
84
86
__builtin_constant_p((bounds) < (length)) && \
@@ -120,7 +122,7 @@ extern char *__underlying_strncpy(char *p, const char *q, __kernel_size_t size)
120
122
__FORTIFY_INLINE __diagnose_as (__builtin_strncpy , 1 , 2 , 3 )
121
123
char * strncpy (char * const POS p , const char * q , __kernel_size_t size )
122
124
{
123
- size_t p_size = __builtin_object_size ( p , 1 );
125
+ size_t p_size = __member_size ( p );
124
126
125
127
if (__compiletime_lessthan (p_size , size ))
126
128
__write_overflow ();
@@ -132,7 +134,7 @@ char *strncpy(char * const POS p, const char *q, __kernel_size_t size)
132
134
__FORTIFY_INLINE __diagnose_as (__builtin_strcat , 1 , 2 )
133
135
char * strcat (char * const POS p , const char * q )
134
136
{
135
- size_t p_size = __builtin_object_size ( p , 1 );
137
+ size_t p_size = __member_size ( p );
136
138
137
139
if (p_size == SIZE_MAX )
138
140
return __underlying_strcat (p , q );
@@ -144,7 +146,7 @@ char *strcat(char * const POS p, const char *q)
144
146
extern __kernel_size_t __real_strnlen (const char * , __kernel_size_t ) __RENAME (strnlen );
145
147
__FORTIFY_INLINE __kernel_size_t strnlen (const char * const POS p , __kernel_size_t maxlen )
146
148
{
147
- size_t p_size = __builtin_object_size ( p , 1 );
149
+ size_t p_size = __member_size ( p );
148
150
size_t p_len = __compiletime_strlen (p );
149
151
size_t ret ;
150
152
@@ -174,7 +176,7 @@ __FORTIFY_INLINE __diagnose_as(__builtin_strlen, 1)
174
176
__kernel_size_t __fortify_strlen (const char * const POS p )
175
177
{
176
178
__kernel_size_t ret ;
177
- size_t p_size = __builtin_object_size ( p , 1 );
179
+ size_t p_size = __member_size ( p );
178
180
179
181
/* Give up if we don't know how large p is. */
180
182
if (p_size == SIZE_MAX )
@@ -189,8 +191,8 @@ __kernel_size_t __fortify_strlen(const char * const POS p)
189
191
extern size_t __real_strlcpy (char * , const char * , size_t ) __RENAME (strlcpy );
190
192
__FORTIFY_INLINE size_t strlcpy (char * const POS p , const char * const POS q , size_t size )
191
193
{
192
- size_t p_size = __builtin_object_size ( p , 1 );
193
- size_t q_size = __builtin_object_size ( q , 1 );
194
+ size_t p_size = __member_size ( p );
195
+ size_t q_size = __member_size ( q );
194
196
size_t q_len ; /* Full count of source string length. */
195
197
size_t len ; /* Count of characters going into destination. */
196
198
@@ -218,8 +220,8 @@ __FORTIFY_INLINE ssize_t strscpy(char * const POS p, const char * const POS q, s
218
220
{
219
221
size_t len ;
220
222
/* Use string size rather than possible enclosing struct size. */
221
- size_t p_size = __builtin_object_size ( p , 1 );
222
- size_t q_size = __builtin_object_size ( q , 1 );
223
+ size_t p_size = __member_size ( p );
224
+ size_t q_size = __member_size ( q );
223
225
224
226
/* If we cannot get size of p and q default to call strscpy. */
225
227
if (p_size == SIZE_MAX && q_size == SIZE_MAX )
@@ -264,8 +266,8 @@ __FORTIFY_INLINE __diagnose_as(__builtin_strncat, 1, 2, 3)
264
266
char * strncat (char * const POS p , const char * const POS q , __kernel_size_t count )
265
267
{
266
268
size_t p_len , copy_len ;
267
- size_t p_size = __builtin_object_size ( p , 1 );
268
- size_t q_size = __builtin_object_size ( q , 1 );
269
+ size_t p_size = __member_size ( p );
270
+ size_t q_size = __member_size ( q );
269
271
270
272
if (p_size == SIZE_MAX && q_size == SIZE_MAX )
271
273
return __underlying_strncat (p , q , count );
@@ -323,11 +325,11 @@ __FORTIFY_INLINE void fortify_memset_chk(__kernel_size_t size,
323
325
})
324
326
325
327
/*
326
- * __builtin_object_size () must be captured here to avoid evaluating argument
327
- * side-effects further into the macro layers.
328
+ * __struct_size () vs __member_size() must be captured here to avoid
329
+ * evaluating argument side-effects further into the macro layers.
328
330
*/
329
331
#define memset (p , c , s ) __fortify_memset_chk(p, c, s, \
330
- __builtin_object_size(p, 0 ), __builtin_object_size(p, 1 ))
332
+ __struct_size(p ), __member_size(p ))
331
333
332
334
/*
333
335
* To make sure the compiler can enforce protection against buffer overflows,
@@ -420,7 +422,7 @@ __FORTIFY_INLINE bool fortify_memcpy_chk(__kernel_size_t size,
420
422
* fake flexible arrays, until they are all converted to
421
423
* proper flexible arrays.
422
424
*
423
- * The implementation of __builtin_object_size () behaves
425
+ * The implementation of __builtin_*object_size () behaves
424
426
* like sizeof() when not directly referencing a flexible
425
427
* array member, which means there will be many bounds checks
426
428
* that will appear at run-time, without a way for them to be
@@ -486,22 +488,22 @@ __FORTIFY_INLINE bool fortify_memcpy_chk(__kernel_size_t size,
486
488
*/
487
489
488
490
/*
489
- * __builtin_object_size () must be captured here to avoid evaluating argument
490
- * side-effects further into the macro layers.
491
+ * __struct_size () vs __member_size() must be captured here to avoid
492
+ * evaluating argument side-effects further into the macro layers.
491
493
*/
492
494
#define memcpy (p , q , s ) __fortify_memcpy_chk(p, q, s, \
493
- __builtin_object_size(p, 0 ), __builtin_object_size(q, 0), \
494
- __builtin_object_size(p, 1 ), __builtin_object_size(q, 1), \
495
+ __struct_size(p ), __struct_size(q), \
496
+ __member_size(p ), __member_size(q), \
495
497
memcpy)
496
498
#define memmove (p , q , s ) __fortify_memcpy_chk(p, q, s, \
497
- __builtin_object_size(p, 0 ), __builtin_object_size(q, 0), \
498
- __builtin_object_size(p, 1 ), __builtin_object_size(q, 1), \
499
+ __struct_size(p ), __struct_size(q), \
500
+ __member_size(p ), __member_size(q), \
499
501
memmove)
500
502
501
503
extern void * __real_memscan (void * , int , __kernel_size_t ) __RENAME (memscan );
502
504
__FORTIFY_INLINE void * memscan (void * const POS0 p , int c , __kernel_size_t size )
503
505
{
504
- size_t p_size = __builtin_object_size ( p , 0 );
506
+ size_t p_size = __struct_size ( p );
505
507
506
508
if (__compiletime_lessthan (p_size , size ))
507
509
__read_overflow ();
@@ -513,8 +515,8 @@ __FORTIFY_INLINE void *memscan(void * const POS0 p, int c, __kernel_size_t size)
513
515
__FORTIFY_INLINE __diagnose_as (__builtin_memcmp , 1 , 2 , 3 )
514
516
int memcmp (const void * const POS0 p , const void * const POS0 q , __kernel_size_t size )
515
517
{
516
- size_t p_size = __builtin_object_size ( p , 0 );
517
- size_t q_size = __builtin_object_size ( q , 0 );
518
+ size_t p_size = __struct_size ( p );
519
+ size_t q_size = __struct_size ( q );
518
520
519
521
if (__builtin_constant_p (size )) {
520
522
if (__compiletime_lessthan (p_size , size ))
@@ -530,7 +532,7 @@ int memcmp(const void * const POS0 p, const void * const POS0 q, __kernel_size_t
530
532
__FORTIFY_INLINE __diagnose_as (__builtin_memchr , 1 , 2 , 3 )
531
533
void * memchr (const void * const POS0 p , int c , __kernel_size_t size )
532
534
{
533
- size_t p_size = __builtin_object_size ( p , 0 );
535
+ size_t p_size = __struct_size ( p );
534
536
535
537
if (__compiletime_lessthan (p_size , size ))
536
538
__read_overflow ();
@@ -542,7 +544,7 @@ void *memchr(const void * const POS0 p, int c, __kernel_size_t size)
542
544
void * __real_memchr_inv (const void * s , int c , size_t n ) __RENAME (memchr_inv );
543
545
__FORTIFY_INLINE void * memchr_inv (const void * const POS0 p , int c , size_t size )
544
546
{
545
- size_t p_size = __builtin_object_size ( p , 0 );
547
+ size_t p_size = __struct_size ( p );
546
548
547
549
if (__compiletime_lessthan (p_size , size ))
548
550
__read_overflow ();
@@ -554,7 +556,7 @@ __FORTIFY_INLINE void *memchr_inv(const void * const POS0 p, int c, size_t size)
554
556
extern void * __real_kmemdup (const void * src , size_t len , gfp_t gfp ) __RENAME (kmemdup );
555
557
__FORTIFY_INLINE void * kmemdup (const void * const POS0 p , size_t size , gfp_t gfp )
556
558
{
557
- size_t p_size = __builtin_object_size ( p , 0 );
559
+ size_t p_size = __struct_size ( p );
558
560
559
561
if (__compiletime_lessthan (p_size , size ))
560
562
__read_overflow ();
@@ -567,8 +569,8 @@ __FORTIFY_INLINE void *kmemdup(const void * const POS0 p, size_t size, gfp_t gfp
567
569
__FORTIFY_INLINE __diagnose_as (__builtin_strcpy , 1 , 2 )
568
570
char * strcpy (char * const POS p , const char * const POS q )
569
571
{
570
- size_t p_size = __builtin_object_size ( p , 1 );
571
- size_t q_size = __builtin_object_size ( q , 1 );
572
+ size_t p_size = __member_size ( p );
573
+ size_t q_size = __member_size ( q );
572
574
size_t size ;
573
575
574
576
/* If neither buffer size is known, immediately give up. */
0 commit comments