From: Koushik Dutta Date: Fri, 29 Nov 2013 17:17:57 +0000 (-0800) Subject: Merge remote-tracking branch 'cern/multiuser-regression-v1' into cm-11.0 X-Git-Tag: android-x86-4.4-r1~53 X-Git-Url: http://git.osdn.net/view?p=android-x86%2Fexternal-koush-Superuser.git;a=commitdiff_plain;h=a43f033dc9a1472821e57aab76b67b76263c99c4 Merge remote-tracking branch 'cern/multiuser-regression-v1' into cm-11.0 Conflicts: Superuser/jni/su/su.c Change-Id: I2474f5048e590592e1baa7f4bb1caf76e1245b74 --- a43f033dc9a1472821e57aab76b67b76263c99c4 diff --cc Superuser/jni/su/su.c index fc8c7ee,9bd60a0..55e54a6 --- a/Superuser/jni/su/su.c +++ b/Superuser/jni/su/su.c @@@ -604,19 -620,51 +604,43 @@@ static int get_api_version() get_property(data, sdk_ver, "ro.build.version.sdk", "0"); int ver = atoi(sdk_ver); free(data); - return ver >= 18; + return ver; } + static void fork_for_samsung(void) + { + // Samsung CONFIG_SEC_RESTRICT_SETUID wants the parent process to have + // EUID 0, or else our setresuid() calls will be denied. So make sure + // all such syscalls are executed by a child process. + int rv; + + switch (fork()) { + case 0: + return; + case -1: + PLOGE("fork"); + exit(1); + default: + if (wait(&rv) < 0) { + exit(1); + } else { + exit(WEXITSTATUS(rv)); + } + } + } + int main(int argc, char *argv[]) { + return su_main(argc, argv, 1); +} + +int su_main(int argc, char *argv[], int need_client) { // start up in daemon mode if prompted if (argc == 2 && strcmp(argv[1], "--daemon") == 0) { return run_daemon(); } - // attempt to use the daemon client if not root, - // or this is api 18 and adb shell (/data is not readable even as root) - if (is_api_18()) { - if (geteuid() != AID_ROOT || getuid() != AID_ROOT) { - // attempt to connect to daemon... - LOGD("starting daemon client %d %d", getuid(), geteuid()); - return connect_daemon(argc, argv); - } - } - - LOGD("skipping daemon client %d %d", getuid(), geteuid()); - + fork_for_samsung(); + // Sanitize all secure environment variables (from linker_environ.c in AOSP linker). /* The same list than GLibc at this point */ static const char* const unsec_vars[] = {