don't try to change run priority, EUID or EGID on restart if they were already set...
authorKevin P. Fleming <kpfleming@digium.com>
Tue, 23 Aug 2005 01:37:26 +0000 (01:37 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Tue, 23 Aug 2005 01:37:26 +0000 (01:37 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6369 65c4cc65-6c06-0410-ace0-fbb531ad65f3

asterisk.c

index fe28615..d50499d 100755 (executable)
@@ -1815,6 +1815,7 @@ int main(int argc, char *argv[])
        FILE *f;
        sigset_t sigs;
        int num;
+       int is_child_of_nonroot=0;
        char *buf;
        char *runuser=NULL, *rungroup=NULL;
 
@@ -1840,6 +1841,11 @@ int main(int argc, char *argv[])
        callerid_init();
        ast_utils_init();
        tdd_init();
+       /* When Asterisk restarts after it has dropped the root privileges,
+        * it can't issue setuid(), setgid(), setgroups() or set_priority() 
+        * */
+       if (getenv("ASTERISK_ALREADY_NONROOT"))
+               is_child_of_nonroot=1;
        if (getenv("HOME")) 
                snprintf(filename, sizeof(filename), "%s/.asterisk_history", getenv("HOME"));
        /* Check if we're root */
@@ -1940,11 +1946,11 @@ int main(int argc, char *argv[])
                ast_verbose("[ Reading Master Configuration ]");
        ast_readconfig();
 
-       if (ast_set_priority(option_highpriority)) {
+       if (!is_child_of_nonroot && ast_set_priority(option_highpriority)) {
                exit(1);
        }
 
-       if (rungroup) {
+       if (!is_child_of_nonroot && rungroup) {
                struct group *gr;
                gr = getgrnam(rungroup);
                if (!gr) {
@@ -1959,7 +1965,7 @@ int main(int argc, char *argv[])
                        ast_verbose("Running as group '%s'\n", rungroup);
        }
 
-       if (runuser) {
+       if (!is_child_of_nonroot && runuser) {
                struct passwd *pw;
                pw = getpwnam(runuser);
                if (!pw) {
@@ -1970,6 +1976,7 @@ int main(int argc, char *argv[])
                        ast_log(LOG_WARNING, "Unable to setuid to %d (%s)\n", pw->pw_uid, runuser);
                        exit(1);
                }
+               setenv("ASTERISK_ALREADY_NONROOT","yes",1);
                if (option_verbose)
                        ast_verbose("Running as user '%s'\n", runuser);
        }