Skip to content

Commit b6c3703

Browse files
committed
Fix integer overflows
1 parent f04168c commit b6c3703

File tree

3 files changed

+37
-3
lines changed

3 files changed

+37
-3
lines changed

src/base_alloc/base_alloc_global.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,10 +155,19 @@ void *umf_ba_global_aligned_alloc(size_t size, size_t alignment) {
155155
return NULL;
156156
}
157157

158+
if (size > SIZE_MAX - ALLOC_METADATA_SIZE) {
159+
LOG_ERR("base_alloc: allocation size (%zu) too large.", size);
160+
return NULL;
161+
}
162+
158163
// for metadata
159164
size += ALLOC_METADATA_SIZE;
160165

161166
if (alignment > ALLOC_METADATA_SIZE) {
167+
if (size > SIZE_MAX - alignment) {
168+
LOG_ERR("base_alloc: allocation size (%zu) too large.", size);
169+
return NULL;
170+
}
162171
size += alignment;
163172
}
164173

src/provider/provider_os_memory.c

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,22 @@ validatePartitions(umf_os_memory_provider_params_t *params) {
341341
return UMF_RESULT_SUCCESS;
342342
}
343343

344+
static umf_result_t os_get_min_page_size(void *provider, void *ptr,
345+
size_t *page_size);
346+
347+
static umf_result_t validatePartSize(os_memory_provider_t *provider,
348+
umf_os_memory_provider_params_t *params) {
349+
size_t page_size;
350+
os_get_min_page_size(provider, NULL, &page_size);
351+
if (ALIGN_UP(params->part_size, page_size) < params->part_size) {
352+
LOG_ERR("partition size (%zu) is too big, cannot align with a page "
353+
"size (%zu)",
354+
params->part_size, page_size);
355+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
356+
}
357+
return UMF_RESULT_SUCCESS;
358+
}
359+
344360
static void free_bitmaps(os_memory_provider_t *provider) {
345361
for (unsigned i = 0; i < provider->nodeset_len; i++) {
346362
hwloc_bitmap_free(provider->nodeset[i]);
@@ -427,6 +443,14 @@ static umf_result_t translate_params(umf_os_memory_provider_params_t *in_params,
427443
return result;
428444
}
429445

446+
if (in_params->numa_mode == UMF_NUMA_MODE_INTERLEAVE) {
447+
result = validatePartSize(provider, in_params);
448+
if (result != UMF_RESULT_SUCCESS) {
449+
LOG_ERR("incorrect partition size: %zu", in_params->part_size);
450+
return result;
451+
}
452+
}
453+
430454
int is_dedicated_node_bind = dedicated_node_bind(in_params);
431455
provider->numa_policy =
432456
translate_numa_mode(in_params->numa_mode, is_dedicated_node_bind);
@@ -574,9 +598,6 @@ static void os_finalize(void *provider) {
574598
umf_ba_global_free(os_provider);
575599
}
576600

577-
static umf_result_t os_get_min_page_size(void *provider, void *ptr,
578-
size_t *page_size);
579-
580601
// TODO: this function should be re-enabled when CTL is implemented
581602
#if 0
582603
static void print_numa_nodes(os_memory_provider_t *os_provider, void *addr,

test/common/provider.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@ struct provider_ba_global : public provider_base_t {
105105
align = 8;
106106
}
107107

108+
if (size > SIZE_MAX - align + 1) {
109+
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
110+
}
111+
108112
// aligned_malloc returns a valid pointer despite not meeting the
109113
// requirement of 'size' being multiple of 'align' even though the
110114
// documentation says that it has to. AddressSanitizer returns an

0 commit comments

Comments
 (0)