argon2: ensure that memory is cacheline aligned; use mmap(2) if possible
This commit is contained in:
parent
9788147270
commit
6d9f2cae79
@ -66,6 +66,7 @@ static void store_block(void *output, const block *src) {
|
||||
|
||||
/***************Memory allocators*****************/
|
||||
int allocate_memory(block_region **region, uint32_t m_cost) {
|
||||
void *base;
|
||||
block *memory;
|
||||
size_t memory_size;
|
||||
|
||||
@ -82,11 +83,39 @@ int allocate_memory(block_region **region, uint32_t m_cost) {
|
||||
return ARGON2_MEMORY_ALLOCATION_ERROR;
|
||||
}
|
||||
|
||||
memory = (block *)malloc(memory_size); /*3. Try to allocate block*/
|
||||
#if defined(MAP_ANON) && defined(HAVE_MMAP)
|
||||
if ((base = mmap(NULL, memory_size, PROT_READ | PROT_WRITE,
|
||||
# ifdef MAP_NOCORE
|
||||
MAP_ANON | MAP_PRIVATE | MAP_NOCORE,
|
||||
# else
|
||||
MAP_ANON | MAP_PRIVATE,
|
||||
# endif
|
||||
-1, 0)) == MAP_FAILED) {
|
||||
base = NULL; /* LCOV_EXCL_LINE */
|
||||
}
|
||||
memcpy(&memory, &base, sizeof memory);
|
||||
#elif defined(HAVE_POSIX_MEMALIGN)
|
||||
if ((errno = posix_memalign((void **) &base, 64, memory_size)) != 0) {
|
||||
base = NULL;
|
||||
}
|
||||
memcpy(&memory, &base, sizeof memory);
|
||||
#else
|
||||
memory = NULL;
|
||||
if (size + 63 < size) {
|
||||
base = NULL;
|
||||
errno = ENOMEM;
|
||||
} else if ((base = malloc(memory_size + 63)) != NULL) {
|
||||
uint8_t *aligned = ((uint8_t *) base) + 63;
|
||||
aligned -= (uintptr_t) aligned & 63;
|
||||
memcpy(&memory, &aligned, sizeof memory);
|
||||
}
|
||||
#endif
|
||||
if (!memory) {
|
||||
return ARGON2_MEMORY_ALLOCATION_ERROR;
|
||||
}
|
||||
(*region)->memory = memory;
|
||||
(*region)->base = base;
|
||||
(*region)->memory = memory;
|
||||
(*region)->size = base ? memory_size : 0;
|
||||
|
||||
return ARGON2_OK;
|
||||
}
|
||||
@ -101,7 +130,15 @@ void clear_memory(argon2_instance_t *instance, int clear) {
|
||||
}
|
||||
|
||||
void free_memory(block_region *region) {
|
||||
free(region->memory);
|
||||
if (region->base) {
|
||||
#if defined(MAP_ANON) && defined(HAVE_MMAP)
|
||||
if (munmap(region->base, region->size)) {
|
||||
return; /* LCOV_EXCL_LINE */
|
||||
}
|
||||
#else
|
||||
free(region->base);
|
||||
#endif
|
||||
}
|
||||
free(region);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user