From 238b18b8ac339c09e11a913b913dffe03902edb5 Mon Sep 17 00:00:00 2001 From: Milan Broz Date: Wed, 13 Mar 2019 08:24:15 +0100 Subject: [PATCH 293/324] Upstream fixes to bundled Argon2 code. Wait for already running threads if a thread creation failed. Use explicit_bzero() on recent glibc versions. (Without fixed logic, we have already macro definition through automake.) Fixes #444. --- lib/crypto_backend/argon2/core.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/crypto_backend/argon2/core.c b/lib/crypto_backend/argon2/core.c index 8e0a2a5..f5b0067 100644 --- a/lib/crypto_backend/argon2/core.c +++ b/lib/crypto_backend/argon2/core.c @@ -125,7 +125,7 @@ void NOT_OPTIMIZED secure_wipe_memory(void *v, size_t n) { SecureZeroMemory(v, n); #elif defined memset_s memset_s(v, n, 0, n); -#elif defined(__OpenBSD__) +#elif defined(HAVE_EXPLICIT_BZERO) explicit_bzero(v, n); #else static void *(*const volatile memset_sec)(void *, int, size_t) = &memset; @@ -299,7 +299,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) { @@ -324,6 +324,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.19.1