[PATCH] Fix build break around __atomic_*() with GCC<4.7

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The __atomic_* GCC primitives were introduced in GCC 4.7, but Red Hat
Enterprise Linux 6.x (for example) provides GCC 4.4. Tweak the current code to
use the (most conservative) __sync_synchronize() primitive provided by those
older GCC versions.

Fixes https://github.com/SELinuxProject/selinux/issues/97

(Really, no __atomic or __sync operations are needed here at all, since POSIX
4.12 "Memory Synchronization" says pthread_mutex_lock() and
pthread_mutex_unlock() "synchronize memory with respect to other threads"...)

---
 libselinux/src/label_file.h | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/libselinux/src/label_file.h b/libselinux/src/label_file.h
index 2fa85474..47859baf 100644
--- a/libselinux/src/label_file.h
+++ b/libselinux/src/label_file.h
@@ -351,8 +351,14 @@ static inline int compile_regex(struct saved_data *data, struct spec *spec,
 	 * init_routine does not take a parameter, it's not possible
 	 * to use, so we generate the same effect with atomics and a
 	 * mutex */
+#ifdef __ATOMIC_RELAXED
 	regex_compiled =
 		__atomic_load_n(&spec->regex_compiled, __ATOMIC_ACQUIRE);
+#else
+	/* GCC <4.7 */
+	__sync_synchronize();
+	regex_compiled = spec->regex_compiled;
+#endif
 	if (regex_compiled) {
 		return 0; /* already done */
 	}
@@ -360,8 +366,14 @@ static inline int compile_regex(struct saved_data *data, struct spec *spec,
 	__pthread_mutex_lock(&spec->regex_lock);
 	/* Check if another thread compiled the regex while we waited
 	 * on the mutex */
+#ifdef __ATOMIC_RELAXED
 	regex_compiled =
 		__atomic_load_n(&spec->regex_compiled, __ATOMIC_ACQUIRE);
+#else
+	/* GCC <4.7 */
+	__sync_synchronize();
+	regex_compiled = spec->regex_compiled;
+#endif
 	if (regex_compiled) {
 		__pthread_mutex_unlock(&spec->regex_lock);
 		return 0;
@@ -404,7 +416,13 @@ static inline int compile_regex(struct saved_data *data, struct spec *spec,
 	}
 
 	/* Done. */
+#ifdef __ATOMIC_RELAXED
 	__atomic_store_n(&spec->regex_compiled, true, __ATOMIC_RELEASE);
+#else
+	/* GCC <4.7 */
+	spec->regex_compiled = true;
+	__sync_synchronize();
+#endif
 	__pthread_mutex_unlock(&spec->regex_lock);
 	return 0;
 }
-- 
2.13.0

_______________________________________________
Selinux mailing list
Selinux@xxxxxxxxxxxxx
To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx.
To get help, send an email containing "help" to Selinux-request@xxxxxxxxxxxxx.



[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux