fixed heap-use-after-free in solidgen
[csRadar.git] / csrMem.h
1 #ifndef CSR_MEM_H
2 #define CSR_MEM_H
3
4 #include "csrTypes.h"
5
6 void *csr_malloc( size_t size )
7 {
8 void *ret = malloc( size );
9 if( !ret )
10 exit(1);
11 return ret;
12 }
13
14 void *csr_calloc( size_t size )
15 {
16 void *ret = calloc( 1, size );
17 if( !ret )
18 exit(1);
19 return ret;
20 }
21
22 void *csr_sb_raw( void *arr )
23 {
24 return ((u32 *)arr)-3;
25 }
26
27 u32 csr_sb_count( void *arr )
28 {
29 return arr? ((u32 *)csr_sb_raw( arr ))[1]: 0;
30 }
31
32 u32 csr_sb_cap( void *arr )
33 {
34 return arr? ((u32 *)csr_sb_raw( arr ))[0]: 0;
35 }
36
37 void *csr_sb_use( void *arr )
38 {
39 u32 *raw = (u32 *)csr_sb_raw( arr );
40 void *data = ((u8 *)arr) + raw[1]*raw[2];
41
42 raw[1] ++;
43
44 return data;
45 }
46
47 void csr_sb_inc( void *arr, u32 amt )
48 {
49 u32 *raw = (u32 *)csr_sb_raw( arr );
50 raw[1] += amt;
51 }
52
53 __attribute__((warn_unused_result))
54 void *csr_sb_reserve( void *arr, u32 amt, u32 esize )
55 {
56 u32 cap = arr? csr_sb_cap( arr ): 0;
57 u32 count = arr? csr_sb_count( arr ): 0;
58
59 if( count + amt > cap )
60 {
61 cap = csr_max( count + amt, cap * 2 );
62 u32 *new_ptr = (u32 *)realloc( arr? csr_sb_raw( arr ): NULL, cap * esize + 3*sizeof(u32) );
63
64 if( !new_ptr )
65 abort();
66
67 new_ptr[0] = cap;
68 new_ptr[1] = count;
69 new_ptr[2] = esize;
70
71 return (void *)(new_ptr+3);
72 }
73 else
74 {
75 return arr;
76 }
77 }
78
79 void csr_sb_free( void *arr )
80 {
81 if( arr )
82 {
83 free( csr_sb_raw( arr ) );
84 }
85 }
86
87 void csr_sb_clear( void *arr )
88 {
89 if( arr )
90 {
91 ((u32 *)csr_sb_raw( arr ))[1] = 0;
92 }
93 }
94
95 // djb2 - Dan Bernstein
96 unsigned long djb2( unsigned char const *str )
97 {
98 unsigned long hash = 5381;
99 int c;
100
101 while((c = *str++))
102 hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
103
104 return hash;
105 }
106
107 #endif