[Mesa-dev] [PATCH] util: Fix race condition on libgcrypt initialization
eocallaghan at alterapraxis.com
eocallaghan at alterapraxis.com
Tue Apr 12 22:27:54 UTC 2016
Reviewed-by: Edward O'Callaghan <eocallaghan at alterapraxis.com>
On 2016-04-13 08:10, Mark Janes wrote:
> Fixes intermittent Vulkan CTS failures within the test groups:
> dEQP-VK.api.object_management.multithreaded_per_thread_device
> dEQP-VK.api.object_management.multithreaded_per_thread_resources
> dEQP-VK.api.object_management.multithreaded_shared_resources
>
> Signed-off-by: Mark Janes <mark.a.janes at intel.com>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94904
> ---
> src/util/mesa-sha1.c | 19 +++++++++++--------
> 1 file changed, 11 insertions(+), 8 deletions(-)
>
> diff --git a/src/util/mesa-sha1.c b/src/util/mesa-sha1.c
> index faa1c87..ca6b89b 100644
> --- a/src/util/mesa-sha1.c
> +++ b/src/util/mesa-sha1.c
> @@ -175,21 +175,24 @@ _mesa_sha1_final(struct mesa_sha1 *ctx, unsigned
> char result[20])
> #elif defined(HAVE_SHA1_IN_LIBGCRYPT) /* Use libgcrypt for SHA1 */
>
> #include <gcrypt.h>
> +#include "c11/threads.h"
> +
> +static void _mesa_libgcrypt_init(void)
> +{
> + if (!gcry_check_version(NULL))
> + return NULL;
> + gcry_control(GCRYCTL_DISABLE_SECMEM, 0);
> + gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
> +}
>
> struct mesa_sha1 *
> _mesa_sha1_init(void)
> {
> - static int init;
> + static once_flag flag = ONCE_FLAG_INIT;
> gcry_md_hd_t h;
> gcry_error_t err;
>
> - if (!init) {
> - if (!gcry_check_version(NULL))
> - return NULL;
> - gcry_control(GCRYCTL_DISABLE_SECMEM, 0);
> - gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
> - init = 1;
> - }
> + call_once(&flag, _mesa_libgcrypt_init);
>
> err = gcry_md_open(&h, GCRY_MD_SHA1, 0);
> if (err)
More information about the mesa-dev
mailing list