forked from mirrors/linux
		
	The size of fields within a structure is needed in a few places in the kernel already, and will be needed for the usercopy whitelisting when declaring whitelist regions within structures. This creates a dedicated macro and redefines offsetofend() to use it. Existing usage, ignoring the 1200+ lustre assert uses: $ git grep -E 'sizeof\(\(\((struct )?[a-zA-Z_]+ \*\)0\)->' | \ grep -v staging/lustre | wc -l 65 Signed-off-by: Kees Cook <keescook@chromium.org>
		
			
				
	
	
		
			39 lines
		
	
	
	
		
			827 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
	
		
			827 B
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: GPL-2.0 */
 | 
						|
#ifndef _LINUX_STDDEF_H
 | 
						|
#define _LINUX_STDDEF_H
 | 
						|
 | 
						|
#include <uapi/linux/stddef.h>
 | 
						|
 | 
						|
#undef NULL
 | 
						|
#define NULL ((void *)0)
 | 
						|
 | 
						|
enum {
 | 
						|
	false	= 0,
 | 
						|
	true	= 1
 | 
						|
};
 | 
						|
 | 
						|
#undef offsetof
 | 
						|
#ifdef __compiler_offsetof
 | 
						|
#define offsetof(TYPE, MEMBER)	__compiler_offsetof(TYPE, MEMBER)
 | 
						|
#else
 | 
						|
#define offsetof(TYPE, MEMBER)	((size_t)&((TYPE *)0)->MEMBER)
 | 
						|
#endif
 | 
						|
 | 
						|
/**
 | 
						|
 * sizeof_field(TYPE, MEMBER)
 | 
						|
 *
 | 
						|
 * @TYPE: The structure containing the field of interest
 | 
						|
 * @MEMBER: The field to return the size of
 | 
						|
 */
 | 
						|
#define sizeof_field(TYPE, MEMBER) sizeof((((TYPE *)0)->MEMBER))
 | 
						|
 | 
						|
/**
 | 
						|
 * offsetofend(TYPE, MEMBER)
 | 
						|
 *
 | 
						|
 * @TYPE: The type of the structure
 | 
						|
 * @MEMBER: The member within the structure to get the end offset of
 | 
						|
 */
 | 
						|
#define offsetofend(TYPE, MEMBER) \
 | 
						|
	(offsetof(TYPE, MEMBER)	+ sizeof_field(TYPE, MEMBER))
 | 
						|
 | 
						|
#endif
 |