77
88#include <string.h>
99#include <stdint.h>
10+ #include <xquic/xquic.h>
1011
1112#include "src/common/xqc_malloc.h"
1213
14+ #ifdef XQC_PROTECT_POOL_MEM
15+ #ifndef XQC_SYS_WINDOWS
16+ #include <stdlib.h>
17+ #include <unistd.h>
18+ #include <sys/mman.h>
19+ #include <assert.h>
20+ #endif
21+ #endif
22+
1323/* Interfaces:
1424 * xqc_memory_pool_t *xqc_create_pool(size_t size)
1525 * void xqc_destroy_pool(xqc_memory_pool_t* pool)
@@ -36,19 +46,78 @@ typedef struct xqc_memory_pool_s {
3646 xqc_memory_block_t * current ;
3747 xqc_memory_large_t * large ; /* large chunk list */
3848 size_t max ;
49+ #ifdef XQC_PROTECT_POOL_MEM
50+ xqc_bool_t protect_block ;
51+ size_t page_size ;
52+ #endif
3953} xqc_memory_pool_t ;
4054
4155#define XQC_MAX_MALLOC_FROM_POOL (4096)
4256
57+ #ifdef XQC_PROTECT_POOL_MEM
58+ static inline void *
59+ xqc_mempool_malloc_protected (size_t size , size_t page_sz )
60+ {
61+ #ifndef XQC_SYS_WINDOWS
62+ int ret ;
63+ void * ptr = NULL ;
64+ ret = posix_memalign (& ptr , page_sz , page_sz + size );
65+ if (ret != 0 ) {
66+ return NULL ;
67+ }
68+ ret = mprotect (ptr , page_sz , PROT_READ );
69+ if (ret != 0 ) {
70+ xqc_free (ptr );
71+ return NULL ;
72+ }
73+ return (void * )((char * )ptr + page_sz );
74+ #else
75+ return xqc_malloc (size );
76+ #endif
77+ }
78+
79+ static inline void
80+ xqc_mempool_free_protected (void * ptr , size_t page_sz ) {
81+ #ifndef XQC_SYS_WINDOWS
82+ void * start ;
83+ int ret ;
84+ start = (void * )((char * )ptr - page_sz );
85+ ret = mprotect (start , page_sz , PROT_READ | PROT_WRITE | PROT_EXEC );
86+ assert (ret == 0 );
87+ xqc_free (start );
88+ #else
89+ xqc_free (ptr );
90+ #endif
91+ }
92+ #endif
4393
94+ #ifdef XQC_PROTECT_POOL_MEM
95+ static inline xqc_memory_pool_t *
96+ xqc_create_pool (size_t size , xqc_bool_t protect_block )
97+ #else
4498static inline xqc_memory_pool_t *
4599xqc_create_pool (size_t size )
100+ #endif
46101{
47102 if (size <= sizeof (xqc_memory_pool_t )) {
48103 return NULL ;
49104 }
50105
106+ #ifdef XQC_PROTECT_POOL_MEM
107+ char * m ;
108+ #ifndef XQC_SYS_WINDOWS
109+ size_t page_sz = sysconf (_SC_PAGESIZE );
110+ #else
111+ size_t page_sz = 4096 ;
112+ #endif
113+ if (protect_block ) {
114+ m = xqc_mempool_malloc_protected (size , page_sz );
115+ } else {
116+ m = xqc_malloc (size );
117+ }
118+ #else
51119 char * m = xqc_malloc (size );
120+ #endif
52121 if (m == NULL ) {
53122 return NULL ;
54123 }
@@ -58,6 +127,10 @@ xqc_create_pool(size_t size)
58127 pool -> block .end = m + size ;
59128 pool -> block .failed = 0 ;
60129 pool -> block .next = NULL ;
130+ #ifdef XQC_PROTECT_POOL_MEM
131+ pool -> protect_block = protect_block ;
132+ pool -> page_size = page_sz ;
133+ #endif
61134
62135 pool -> current = & pool -> block ;
63136 pool -> large = NULL ;
@@ -76,23 +149,61 @@ xqc_destroy_pool(xqc_memory_pool_t *pool)
76149 while (block ) {
77150 xqc_memory_block_t * p = block ;
78151 block = block -> next ;
152+ #ifdef XQC_PROTECT_POOL_MEM
153+ if (pool -> protect_block ) {
154+ xqc_mempool_free_protected (p , pool -> page_size );
155+
156+ } else {
157+ xqc_free (p );
158+ }
159+ #else
79160 xqc_free (p );
161+ #endif
80162 }
81163
82164 xqc_memory_large_t * large = pool -> large ;
83165 while (large ) {
84166 xqc_memory_large_t * p = large ;
85167 large = large -> next ;
168+ #ifdef XQC_PROTECT_POOL_MEM
169+ if (pool -> protect_block ) {
170+ xqc_mempool_free_protected (p , pool -> page_size );
171+
172+ } else {
173+ xqc_free (p );
174+ }
175+ #else
86176 xqc_free (p );
177+ #endif
87178 }
88179
89- xqc_free (pool );
180+ #ifdef XQC_PROTECT_POOL_MEM
181+ if (pool -> protect_block ) {
182+ xqc_mempool_free_protected (pool , pool -> page_size );
183+
184+ } else {
185+ xqc_free (pool );
186+ }
187+ #else
188+ xqc_free (pool );
189+ #endif
90190}
91191
92192static inline void *
93193xqc_palloc_large (xqc_memory_pool_t * pool , size_t size )
94194{
195+ #ifdef XQC_PROTECT_POOL_MEM
196+ xqc_memory_large_t * p ;
197+ if (pool -> protect_block ) {
198+ p = xqc_mempool_malloc_protected (size + sizeof (xqc_memory_large_t ), pool -> page_size );
199+
200+ } else {
201+ p = xqc_malloc (size + sizeof (xqc_memory_large_t ));
202+ }
203+ #else
95204 xqc_memory_large_t * p = xqc_malloc (size + sizeof (xqc_memory_large_t ));
205+ #endif
206+
96207 if (p == NULL ) {
97208 return NULL ;
98209 }
@@ -112,7 +223,18 @@ xqc_palloc_block(xqc_memory_pool_t *pool, size_t size)
112223{
113224 size_t psize = pool -> block .end - (char * )pool ;
114225
226+ #ifdef XQC_PROTECT_POOL_MEM
227+ char * m ;
228+ if (pool -> protect_block ) {
229+ m = xqc_mempool_malloc_protected (psize , pool -> page_size );
230+
231+ } else {
232+ m = xqc_malloc (psize );
233+ }
234+ #else
115235 char * m = xqc_malloc (psize );
236+ #endif
237+
116238 if (m == NULL ) {
117239 return NULL ;
118240 }
0 commit comments