40 lines
		
	
	
		
			896 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
		
			896 B
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * by Scarlett. public domain.
 | |
|  * replacements for w3m's allocation macros which add overflow
 | |
|  * detection and concentrate the macros in one file
 | |
|  */
 | |
| #ifndef W3_ALLOC_H
 | |
| #define W3_ALLOC_H
 | |
| #include <gc.h>
 | |
| #include <stdlib.h>
 | |
| #include <stdio.h>
 | |
| #include <limits.h>
 | |
| 
 | |
| static inline size_t
 | |
| z_mult_no_oflow_(size_t n, size_t size)
 | |
| {
 | |
| 	if (size != 0 && n > ULONG_MAX / size) {
 | |
| 		fprintf(stderr,
 | |
| 		    "w3m: overflow in malloc, %lu*%lu\n", (unsigned long)n, (unsigned long)size);
 | |
| 		exit(1);
 | |
| 	}
 | |
| 	return n * size;
 | |
| }
 | |
| 
 | |
| #define New(type) \
 | |
| 	(GC_MALLOC(sizeof(type)))
 | |
| 
 | |
| #define NewAtom(type) \
 | |
| 	(GC_MALLOC_ATOMIC(sizeof(type)))
 | |
| 
 | |
| #define New_N(type, n) \
 | |
| 	(GC_MALLOC(z_mult_no_oflow_((n), sizeof(type))))
 | |
| 
 | |
| #define NewAtom_N(type, n) \
 | |
| 	(GC_MALLOC_ATOMIC(z_mult_no_oflow_((n), sizeof(type))))
 | |
| 
 | |
| #define New_Reuse(type, ptr, n) \
 | |
| 	(GC_REALLOC((ptr), z_mult_no_oflow_((n), sizeof(type))))
 | |
| 
 | |
| #endif /* W3_ALLOC_H */
 |