OSDN Git Service

Merge remote-tracking branch 'cern/multiuser-regression-v1' into cm-11.0
authorKoushik Dutta <koushd@gmail.com>
Fri, 29 Nov 2013 17:17:57 +0000 (09:17 -0800)
committerKoushik Dutta <koushd@gmail.com>
Fri, 29 Nov 2013 17:17:57 +0000 (09:17 -0800)
Conflicts:
Superuser/jni/su/su.c

Change-Id: I2474f5048e590592e1baa7f4bb1caf76e1245b74

1  2 
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[] = {