From d7907a557876fb0e28f1d708591ad9f2797362f6 Mon Sep 17 00:00:00 2001 From: Ivan Maidanski Date: Tue, 6 Dec 2016 00:49:33 +0300 Subject: [PATCH] Fix potential data race in GC_SysVGetDataStart (SPARC) * os_dep.c [SVR4 || AUX || DGUX || LINUX && SPARC] (GC_SysVGetDataStart): Use AO_fetch_and_add(p,0) if available instead of non-atomic read/write in *p = *p statement (thus, to avoid data race though it is highly unlikely). --- os_dep.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/os_dep.c b/os_dep.c index ae9c338..b78943a 100644 --- a/os_dep.c +++ b/os_dep.c @@ -1872,11 +1872,17 @@ void GC_register_data_segments(void) GC_setup_temporary_fault_handler(); if (SETJMP(GC_jmp_buf) == 0) { /* Try writing to the address. */ - char v = *result; -# if defined(CPPCHECK) - GC_noop1((word)&v); +# ifdef AO_HAVE_fetch_and_add + volatile AO_t zero = 0; + (void)AO_fetch_and_add((volatile AO_t *)result, zero); +# else + /* Fallback to non-atomic fetch-and-store. */ + char v = *result; +# if defined(CPPCHECK) + GC_noop1((word)&v); +# endif + *result = v; # endif - *result = v; GC_reset_fault_handler(); } else { GC_reset_fault_handler(); -- 2.7.4