mirror of
				https://github.com/GrapheneOS/hardened_malloc.git
				synced 2025-11-04 09:46:32 +01:00 
			
		
		
		
	Merge 10e27e2142 into e371736b17
				
					
				
			This commit is contained in:
		
						commit
						ed604aa2d1
					
				
					 1 changed files with 15 additions and 1 deletions
				
			
		
							
								
								
									
										16
									
								
								h_malloc.c
									
										
									
									
									
								
							
							
						
						
									
										16
									
								
								h_malloc.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -20,6 +20,13 @@
 | 
			
		|||
#include "random.h"
 | 
			
		||||
#include "util.h"
 | 
			
		||||
 | 
			
		||||
#pragma GCC diagnostic push
 | 
			
		||||
#pragma GCC diagnostic ignored "-Wundef"
 | 
			
		||||
#if __x86_64__
 | 
			
		||||
#include "immintrin.h"
 | 
			
		||||
#endif
 | 
			
		||||
#pragma GCC diagnostic pop
 | 
			
		||||
 | 
			
		||||
#ifdef USE_PKEY
 | 
			
		||||
#include <sys/mman.h>
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -405,8 +412,15 @@ static size_t get_free_slot(struct random_state *rng, size_t slots, const struct
 | 
			
		|||
        // randomize start location for linear search (uniform random choice is too slow)
 | 
			
		||||
        size_t random_index = get_random_u16_uniform(rng, slots);
 | 
			
		||||
        size_t first_bitmap = random_index / U64_WIDTH;
 | 
			
		||||
#pragma GCC diagnostic push
 | 
			
		||||
#pragma GCC diagnostic ignored "-Wundef"
 | 
			
		||||
// __BMI2__ is idiomatic to gcc unfortunately.
 | 
			
		||||
#if __x86_64__ && (__BMI2__ || (__clang__ && __BMI2INTRIN_H_))
 | 
			
		||||
#pragma GCC diagnostic pop
 | 
			
		||||
        u64 random_split = ~(~0UL << _pext_u64(random_index, 8));
 | 
			
		||||
#else
 | 
			
		||||
        u64 random_split = ~(~0UL << (random_index - first_bitmap * U64_WIDTH));
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
        size_t i = first_bitmap;
 | 
			
		||||
        u64 masked = metadata->bitmap[i];
 | 
			
		||||
        masked |= random_split;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue