From: Nick Kralevich Date: Thu, 4 Apr 2019 22:54:58 +0000 (-0700) Subject: Don't set sehash when calling restoreconRecursive X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=cb1dddad27b86e675f7141ca429e9bb8ab8ac410;p=android-x86%2Fframeworks-base.git Don't set sehash when calling restoreconRecursive restorecon_recursive updates the SELinux label of the files in the filesystem, and then attempts to write the xattr "security.sehash" as an optimization for future restorecons. Writing security.* extended attributes requires CAP_SYS_ADMIN, which system_server doesn't have (and shouldn't have). Suppress the computation and writing of the hash value. It's not needed. This bug has been around for a long time, but due to the fix for bug 62302954, the error message is being generated more frequently now. TODO: It would be better if the default for restorecon was to suppress the hash computation, since otherwise it encourages programs to be overprivileged with CAP_SYS_ADMIN. I'll plan on doing that in a followup commit. Bugs where this error message has been called out: Bug: 129766333 Bug: 129271240 Bug: 128700692 Bug: 129925723 Test: install an APK and ensure that no "SELinux: setxattr failed" error messages are generated. Change-Id: I83f4f225e4e73453daea42dbcabf0f8a06d320d6 --- diff --git a/core/java/android/os/SELinux.java b/core/java/android/os/SELinux.java index 8ffafe4bc364..86d9f89f2a7c 100644 --- a/core/java/android/os/SELinux.java +++ b/core/java/android/os/SELinux.java @@ -31,12 +31,15 @@ import java.io.IOException; public class SELinux { private static final String TAG = "SELinux"; - /** Keep in sync with ./external/libselinux/include/selinux/android.h */ + /** Keep in sync with ./external/selinux/libselinux/include/selinux/android.h */ private static final int SELINUX_ANDROID_RESTORECON_NOCHANGE = 1; private static final int SELINUX_ANDROID_RESTORECON_VERBOSE = 2; private static final int SELINUX_ANDROID_RESTORECON_RECURSE = 4; private static final int SELINUX_ANDROID_RESTORECON_FORCE = 8; private static final int SELINUX_ANDROID_RESTORECON_DATADATA = 16; + private static final int SELINUX_ANDROID_RESTORECON_SKIPCE = 32; + private static final int SELINUX_ANDROID_RESTORECON_CROSS_FILESYSTEMS = 64; + private static final int SELINUX_ANDROID_RESTORECON_SKIP_SEHASH = 128; /** * Determine whether SELinux is disabled or enabled. @@ -175,7 +178,8 @@ public class SELinux { @UnsupportedAppUsage public static boolean restoreconRecursive(File file) { try { - return native_restorecon(file.getCanonicalPath(), SELINUX_ANDROID_RESTORECON_RECURSE); + return native_restorecon(file.getCanonicalPath(), + SELINUX_ANDROID_RESTORECON_RECURSE | SELINUX_ANDROID_RESTORECON_SKIP_SEHASH); } catch (IOException e) { Slog.e(TAG, "Error getting canonical path. Restorecon failed for " + file.getPath(), e);