Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a372f6f2 authored by Elliott Hughes's avatar Elliott Hughes
Browse files

Fix the run-as environment to better match su.

$USER and $LOGNAME along with $HOME were just plain wrong (leading to a
misleading interactive prompt), and it probably makes sense to reset the
variables that su would reset.

Bug: https://code.google.com/p/android/issues/detail?id=187438
Change-Id: I0404511453d371f36801f0212a8d72d93f0bc8ac
parent 19d9454e
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@

#include <dirent.h>
#include <errno.h>
#include <paths.h>
#include <pwd.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
@@ -193,10 +195,21 @@ int main(int argc, char **argv)
        panic("Could not set SELinux security context: %s\n", strerror(errno));
    }

    /* cd into the data directory */
    // cd into the data directory, and set $HOME correspondingly.
    if (TEMP_FAILURE_RETRY(chdir(info.dataDir)) < 0) {
        panic("Could not cd to package's data directory: %s\n", strerror(errno));
    }
    setenv("HOME", info.dataDir, 1);

    // Reset parts of the environment, like su would.
    setenv("PATH", _PATH_DEFPATH, 1);
    unsetenv("IFS");

    // Set the user-specific parts for this user.
    struct passwd* pw = getpwuid(uid);
    setenv("LOGNAME", pw->pw_name, 1);
    setenv("SHELL", pw->pw_shell, 1);
    setenv("USER", pw->pw_name, 1);

    /* User specified command for exec. */
    if ((argc >= commandArgvOfs + 1) &&