 2912f9f2a2
			
		
	
	2912f9f2a2
	
	
	
		
			
			Backport most important fixes up to latest HEAD - Taken post-commit reverts/fixes into account Compile tested Run-tested on cns3xxx & imx6 targets Signed-off-by: Koen Vandeputte <koen.vandeputte@ncentric.com>
		
			
				
	
	
		
			44 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 66570ec9c465e3c6c5d6dbd7dd42e45041a39288 Mon Sep 17 00:00:00 2001
 | |
| From: Rich Felker <dalias@aerifal.cx>
 | |
| Date: Mon, 19 Sep 2016 11:15:51 -0400
 | |
| Subject: fix undefined behavior in sched.h cpu_set_t usage
 | |
| 
 | |
| since cpu sets can be dynamically allocated and have variable size,
 | |
| accessing their contents via ->__bits is not valid; performing pointer
 | |
| arithmetic outside the range of the size of the declared __bits array
 | |
| results in undefined beahavior. instead, only use cpu_set_t for
 | |
| fixed-size cpu set objects (instantiated by the caller) and as an
 | |
| abstract pointer type for dynamically allocated ones. perform all
 | |
| accesses simply by casting the abstract pointer type cpuset_t * back
 | |
| to unsigned long *.
 | |
| ---
 | |
|  include/sched.h | 6 +++---
 | |
|  1 file changed, 3 insertions(+), 3 deletions(-)
 | |
| 
 | |
| diff --git a/include/sched.h b/include/sched.h
 | |
| index af82d6c..d1cccb7 100644
 | |
| --- a/include/sched.h
 | |
| +++ b/include/sched.h
 | |
| @@ -82,7 +82,7 @@ int sched_getaffinity(pid_t, size_t, cpu_set_t *);
 | |
|  int sched_setaffinity(pid_t, size_t, const cpu_set_t *);
 | |
|  
 | |
|  #define __CPU_op_S(i, size, set, op) ( (i)/8U >= (size) ? 0 : \
 | |
| -	((set)->__bits[(i)/8/sizeof(long)] op (1UL<<((i)%(8*sizeof(long))))) )
 | |
| +	(((unsigned long *)(set))[(i)/8/sizeof(long)] op (1UL<<((i)%(8*sizeof(long))))) )
 | |
|  
 | |
|  #define CPU_SET_S(i, size, set) __CPU_op_S(i, size, set, |=)
 | |
|  #define CPU_CLR_S(i, size, set) __CPU_op_S(i, size, set, &=~)
 | |
| @@ -94,8 +94,8 @@ static __inline void __CPU_##func##_S(size_t __size, cpu_set_t *__dest, \
 | |
|  { \
 | |
|  	size_t __i; \
 | |
|  	for (__i=0; __i<__size/sizeof(long); __i++) \
 | |
| -		__dest->__bits[__i] = __src1->__bits[__i] \
 | |
| -			op __src2->__bits[__i] ; \
 | |
| +		((unsigned long *)__dest)[__i] = ((unsigned long *)__src1)[__i] \
 | |
| +			op ((unsigned long *)__src2)[__i] ; \
 | |
|  }
 | |
|  
 | |
|  __CPU_op_func_S(AND, &)
 | |
| -- 
 | |
| cgit v0.11.2
 |