Go to file
Tom Cherry 00548bd9b6 libselinux: fix thread safety issues with lookup_common()
There are two problems with lookup_common() and therefore
selabel_lookup() and related functions that this patch fixes:

1) A race with the lazy compilation of regexes.  Since the struct
regex_data is allocated and assigned immediately to the parent struct
spec, it's possible for a second thread to see that this pointer is
non-NULL before the regex compilation has finished.  This typically
results in a -1 return from selabel_lookup() with ENOENT as errno.

This is fixed by adding synchronization in compile_regex().

2) A race with PCRE2 regex_match().  A struct pcre2_match_data is
created once and used for all regex matches for a given regex.  This
is problematic if two threads are attempting to evaluate the same
regex simultaneously.  This typically results in a successful return
from selabel_lookup() but with an erroneous selabel.

This is fixed by adding a pthread_mutex within regex_match() for
PCRE2.  Note, on my system, creating new matchdata takes roughly an
order of magnitude more time than locking a non-contended
pthread_mutex.  I don't believe programs will have enough contention
on this lock to justify that cost.

Bug: 63861738
Test: ueventd unit tests
Change-Id: I13bf782d81d0a0b896d444e396f307ad0dbacb6a
2017-07-26 16:23:04 -04:00
checkpolicy Update VERSION files for 2.7-rc5 2017-07-18 12:01:26 -04:00
dbus Update VERSION files for 2.7-rc5 2017-07-18 12:01:26 -04:00
gui Update VERSION files for 2.7-rc5 2017-07-18 12:01:26 -04:00
libselinux libselinux: fix thread safety issues with lookup_common() 2017-07-26 16:23:04 -04:00
libsemanage Update VERSION files for 2.7-rc5 2017-07-18 12:01:26 -04:00
libsepol libsepol: cil: enable cpp compilation of cil.h. 2017-07-26 13:24:22 -04:00
mcstrans Update VERSION files for 2.7-rc5 2017-07-18 12:01:26 -04:00
policycoreutils Update VERSION files for 2.7-rc5 2017-07-18 12:01:26 -04:00
python Update VERSION files for 2.7-rc5 2017-07-18 12:01:26 -04:00
restorecond Update VERSION files for 2.7-rc5 2017-07-18 12:01:26 -04:00
sandbox Update VERSION files for 2.7-rc5 2017-07-18 12:01:26 -04:00
scripts Fix release script 2016-11-16 11:19:51 -05:00
secilc Update VERSION files for 2.7-rc5 2017-07-18 12:01:26 -04:00
semodule-utils Update VERSION files for 2.7-rc5 2017-07-18 12:01:26 -04:00
.gitignore restorecond: Add gitignore 2016-11-16 11:20:05 -05:00
.travis.yml Travis-CI: test defining CFLAGS, LDFLAGS, etc. on make command line 2017-06-30 08:56:43 -04:00
CleanSpec.mk Add empty top level Android.mk / CleanSpec.mk files 2015-04-16 07:54:09 -04:00
Makefile Add includes for DESTDIR only in root Makefile 2017-04-25 08:31:10 -04:00
README libsepol compilation fixes for macOS. 2017-01-20 13:19:57 -05:00

Please submit all bug reports and patches to selinux@tycho.nsa.gov.
Subscribe via selinux-join@tycho.nsa.gov.

Build dependencies on Fedora:
yum install audit-libs-devel bison bzip2-devel dbus-devel dbus-glib-devel flex flex-devel flex-static glib2-devel libcap-devel libcap-ng-devel pam-devel pcre-devel python-devel setools-devel swig xmlto redhat-rpm-config

To build and install everything under a private directory, run:
make DESTDIR=~/obj install install-pywrap

To install as the default system libraries and binaries
(overwriting any previously installed ones - dangerous!),
on x86_64, run:
make LIBDIR=/usr/lib64 SHLIBDIR=/lib64 install install-pywrap relabel
or on x86 (32-bit), run:
make install install-pywrap relabel

This may render your system unusable if the upstream SELinux userspace
lacks library functions or other dependencies relied upon by your
distribution.  If it breaks, you get to keep both pieces.

To install libsepol on macOS (mainly for policy analysis):
cd libsepol; make DESTDIR=/usr/local PREFIX=/usr/local install

This requires GNU coreutils (brew install coreutils).