1414
1515struct git_pool_page {
1616 git_pool_page * next ;
17- uint32_t size ;
18- uint32_t avail ;
17+ size_t size ;
18+ size_t avail ;
1919 GIT_ALIGN (char data [GIT_FLEX_ARRAY ], 8 );
2020};
2121
22- static void * pool_alloc_page (git_pool * pool , uint32_t size );
22+ static void * pool_alloc_page (git_pool * pool , size_t size );
2323
24- uint32_t git_pool__system_page_size (void )
24+ size_t git_pool__system_page_size (void )
2525{
26- static uint32_t size = 0 ;
26+ static size_t size = 0 ;
2727
2828 if (!size ) {
2929 size_t page_size ;
3030 if (git__page_size (& page_size ) < 0 )
3131 page_size = 4096 ;
3232 /* allow space for malloc overhead */
33- size = (uint32_t )( page_size - (2 * sizeof (void * )) - sizeof (git_pool_page ));
33+ size = (page_size - (2 * sizeof (void * )) - sizeof (git_pool_page ));
3434 }
3535
3636 return size ;
3737}
3838
3939#ifndef GIT_DEBUG_POOL
40- void git_pool_init (git_pool * pool , uint32_t item_size )
40+ void git_pool_init (git_pool * pool , size_t item_size )
4141{
4242 assert (pool );
4343 assert (item_size >= 1 );
@@ -59,10 +59,10 @@ void git_pool_clear(git_pool *pool)
5959 pool -> pages = NULL ;
6060}
6161
62- static void * pool_alloc_page (git_pool * pool , uint32_t size )
62+ static void * pool_alloc_page (git_pool * pool , size_t size )
6363{
6464 git_pool_page * page ;
65- const uint32_t new_page_size = (size <= pool -> page_size ) ? pool -> page_size : size ;
65+ const size_t new_page_size = (size <= pool -> page_size ) ? pool -> page_size : size ;
6666 size_t alloc_size ;
6767
6868 if (GIT_ADD_SIZET_OVERFLOW (& alloc_size , new_page_size , sizeof (git_pool_page )) ||
@@ -78,7 +78,7 @@ static void *pool_alloc_page(git_pool *pool, uint32_t size)
7878 return page -> data ;
7979}
8080
81- static void * pool_alloc (git_pool * pool , uint32_t size )
81+ static void * pool_alloc (git_pool * pool , size_t size )
8282{
8383 git_pool_page * page = pool -> pages ;
8484 void * ptr = NULL ;
@@ -125,7 +125,7 @@ static int git_pool__ptr_cmp(const void * a, const void * b)
125125 }
126126}
127127
128- void git_pool_init (git_pool * pool , uint32_t item_size )
128+ void git_pool_init (git_pool * pool , size_t item_size )
129129{
130130 assert (pool );
131131 assert (item_size >= 1 );
@@ -141,7 +141,7 @@ void git_pool_clear(git_pool *pool)
141141 git_vector_free_deep (& pool -> allocations );
142142}
143143
144- static void * pool_alloc (git_pool * pool , uint32_t size ) {
144+ static void * pool_alloc (git_pool * pool , size_t size ) {
145145 void * ptr = NULL ;
146146 if ((ptr = git__malloc (size )) == NULL ) {
147147 return NULL ;
@@ -169,26 +169,26 @@ void git_pool_swap(git_pool *a, git_pool *b)
169169 memcpy (b , & temp , sizeof (temp ));
170170}
171171
172- static uint32_t alloc_size (git_pool * pool , uint32_t count )
172+ static size_t alloc_size (git_pool * pool , size_t count )
173173{
174- const uint32_t align = sizeof (void * ) - 1 ;
174+ const size_t align = sizeof (void * ) - 1 ;
175175
176176 if (pool -> item_size > 1 ) {
177- const uint32_t item_size = (pool -> item_size + align ) & ~align ;
177+ const size_t item_size = (pool -> item_size + align ) & ~align ;
178178 return item_size * count ;
179179 }
180180
181181 return (count + align ) & ~align ;
182182}
183183
184- void * git_pool_malloc (git_pool * pool , uint32_t items )
184+ void * git_pool_malloc (git_pool * pool , size_t items )
185185{
186186 return pool_alloc (pool , alloc_size (pool , items ));
187187}
188188
189- void * git_pool_mallocz (git_pool * pool , uint32_t items )
189+ void * git_pool_mallocz (git_pool * pool , size_t items )
190190{
191- const uint32_t size = alloc_size (pool , items );
191+ const size_t size = alloc_size (pool , items );
192192 void * ptr = pool_alloc (pool , size );
193193 if (ptr )
194194 memset (ptr , 0x0 , size );
@@ -201,10 +201,10 @@ char *git_pool_strndup(git_pool *pool, const char *str, size_t n)
201201
202202 assert (pool && str && pool -> item_size == sizeof (char ));
203203
204- if (( uint32_t )( n + 1 ) < n )
204+ if (n == SIZE_MAX )
205205 return NULL ;
206206
207- if ((ptr = git_pool_malloc (pool , (uint32_t )( n + 1 ))) != NULL ) {
207+ if ((ptr = git_pool_malloc (pool , (n + 1 ))) != NULL ) {
208208 memcpy (ptr , str , n );
209209 ptr [n ] = '\0' ;
210210 }
@@ -226,14 +226,18 @@ char *git_pool_strdup_safe(git_pool *pool, const char *str)
226226char * git_pool_strcat (git_pool * pool , const char * a , const char * b )
227227{
228228 void * ptr ;
229- size_t len_a , len_b ;
229+ size_t len_a , len_b , total ;
230230
231231 assert (pool && pool -> item_size == sizeof (char ));
232232
233233 len_a = a ? strlen (a ) : 0 ;
234234 len_b = b ? strlen (b ) : 0 ;
235235
236- if ((ptr = git_pool_malloc (pool , (uint32_t )(len_a + len_b + 1 ))) != NULL ) {
236+ if (GIT_ADD_SIZET_OVERFLOW (& total , len_a , len_b ) ||
237+ GIT_ADD_SIZET_OVERFLOW (& total , total , 1 ))
238+ return NULL ;
239+
240+ if ((ptr = git_pool_malloc (pool , total )) != NULL ) {
237241 if (len_a )
238242 memcpy (ptr , a , len_a );
239243 if (len_b )
0 commit comments