|
@@ -0,0 +1,70 @@
|
|
|
+From abe76789f8e7ce61b357f693eaed5b28feab5ce2 Mon Sep 17 00:00:00 2001
|
|
|
+From: Hollis Blanchard <hollis_blanchard@mentor.com>
|
|
|
+Date: Mon, 13 Aug 2018 12:11:33 -0700
|
|
|
+Subject: [PATCH] Fix build break around __atomic_*() with GCC<4.7
|
|
|
+
|
|
|
+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.
|
|
|
+
|
|
|
+(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"...)
|
|
|
+
|
|
|
+Signed-off-by: Hollis Blanchard <hollis_blanchard@mentor.com>
|
|
|
+---
|
|
|
+ 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
|
|
|
+
|