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 @@ -284,7 +284,7 @@ int fill_memory_blocks(argon2_instance_t 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) { @@ -309,6 +309,9 @@ int fill_memory_blocks(argon2_instance_t 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