From cfa4385e728116989ad88b4be7c23b4868422778 Mon Sep 17 00:00:00 2001 From: Milan Broz Date: Mon, 11 Mar 2019 21:21:57 +0100 Subject: [PATCH] Wait for already running threads if a thread creation failed. On memory-constrained systems (like cgroups limited processes) thread creation often fails. The code needs to wait for already running threads on error path; otherwise these threads can access deallocated memory (and cause a segfault or another crash). --- src/core.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/core.c b/src/core.c index 8361175..65f0537 100644 --- a/src/core.c +++ b/src/core.c @@ -310,7 +310,7 @@ static int fill_memory_blocks_mt(argon2_instance_t *instance) { for (r = 0; r < instance->passes; ++r) { for (s = 0; s < ARGON2_SYNC_POINTS; ++s) { - uint32_t l; + uint32_t l, ll; /* 2. Calling threads */ for (l = 0; l < instance->lanes; ++l) { @@ -335,6 +335,9 @@ static int fill_memory_blocks_mt(argon2_instance_t *instance) { sizeof(argon2_position_t)); if (argon2_thread_create(&thread[l], &fill_segment_thr, (void *)&thr_data[l])) { + /* Wait for already running threads */ + for (ll = 0; ll < l; ++ll) + argon2_thread_join(thread[ll]); rc = ARGON2_THREAD_FAIL; goto fail; } -- 2.20.1