| 307 | } |
| 308 | |
| 309 | static void *slab_calloc(size_t count, size_t size) { |
| 310 | /* Overflow check */ |
| 311 | if (count > 0 && size > SIZE_MAX / count) { |
| 312 | return NULL; |
| 313 | } |
| 314 | size_t total = count * size; |
| 315 | void *ptr = slab_malloc(total); |
| 316 | if (ptr) { |
| 317 | /* Must zero: free-list recycled blocks contain stale data. */ |
| 318 | memset(ptr, 0, total); |
| 319 | } |
| 320 | return ptr; |
| 321 | } |
| 322 | |
| 323 | static void *slab_realloc(void *ptr, size_t new_size) { |
| 324 | if (!ptr) { |
no test coverage detected