Index: corelib/openpbx.c =================================================================== --- corelib/openpbx.c (revision 855) +++ corelib/openpbx.c (working copy) @@ -2016,42 +2016,75 @@ runuser = opbx_config_OPBX_RUN_USER; if (!rungroup) rungroup = opbx_config_OPBX_RUN_GROUP; - if (!is_child_of_nonroot && rungroup) { + if (!is_child_of_nonroot) { struct group *gr; + struct passwd *pw; + gr = getgrnam(rungroup); if (!gr) { - opbx_log(LOG_WARNING, "No such group '%s'!\n", rungroup); + opbx_log(LOG_ERROR, "No such group '%s'!\n", rungroup); exit(1); } + pw = getpwnam(runuser); + if (!pw) { + opbx_log(LOG_ERROR, "No such user '%s'!\n", runuser); + exit(1); + } + + if (initgroups(pw->pw_name, gr->gr_gid) == -1) { + opbx_log(LOG_ERROR, "Unable to initgroups(\"%s\", %d)\n", pw->pw_name, gr->gr_gid); + exit(1); + } #ifdef __Darwin__ if (setgid(gr->gr_gid)) { #else if (setregid(gr->gr_gid, gr->gr_gid)) { #endif - opbx_log(LOG_WARNING, "Unable to setgid to %d (%s)\n", gr->gr_gid, rungroup); + opbx_log(LOG_ERROR, "Unable to setgid to '%s' (%d)\n", gr->gr_name, gr->gr_gid); exit(1); } - if (option_verbose) - opbx_verbose("Running as group '%s'\n", rungroup); - } - if (!is_child_of_nonroot && runuser) { - struct passwd *pw; - pw = getpwnam(runuser); - if (!pw) { - opbx_log(LOG_WARNING, "No such user '%s'!\n", runuser); - exit(1); + if (option_verbose) { + int ngroups; + gid_t gid_list[NGROUPS_MAX]; + int i; + struct group *gr2; + + gr2 = getgrgid(getegid()); + if (gr2) { + opbx_verbose("Now running as group '%s' (%d)\n", gr2->gr_name, gr2->gr_gid); + } else { + opbx_verbose("Now running as group %d\n", getegid()); + } + + opbx_verbose("Supplementary groups:\n"); + ngroups = getgroups(NGROUPS_MAX, gid_list); + for (i = 0; i < ngroups; i++) { + gr2 = getgrgid(gid_list[i]); + if (gr2) { + opbx_verbose(" %s (%d)\n", gr2->gr_name, gr2->gr_gid); + } else { + opbx_verbose(" %d\n", gid_list[i]); + } + } } #ifdef __Darwin__ if (setuid(pw->pw_uid)) { #else if (setreuid(pw->pw_uid, pw->pw_uid)) { #endif - opbx_log(LOG_WARNING, "Unable to setuid to %d (%s)\n", pw->pw_uid, runuser); + opbx_log(LOG_ERROR, "Unable to setuid to '%s' (%d)\n", pw->pw_name, pw->pw_uid); exit(1); } setenv("OPENPBX_ALREADY_NONROOT","yes",1); - if (option_verbose) - opbx_verbose("Running as user '%s'\n", runuser); + if (option_verbose) { + struct passwd *pw2; + pw2 = getpwuid(geteuid()); + if (pw2) { + opbx_verbose("Now running as user '%s' (%d)\n", pw2->pw_name, pw2->pw_uid); + } else { + opbx_verbose("Now running as user (%d)\n", getegid()); + } + } } /* Check if we're root */