void priv_init(void) { uid = cur_uid = getuid(); if (!uid) under_root_login =1; euid = cur_euid = geteuid(); if (!euid) can_do_root_stuff = 1; if (!uid) skip_priv_setting = 1; gid = cur_gid = getgid(); egid = cur_egid = getegid(); /* must store the /proc/self/exe symlink contents before dropping privs! */ dosemu_proc_self_exe = readlink_malloc("/proc/self/exe"); /* For Fedora we must also save a file descriptor to /proc/self/maps */ dosemu_proc_self_maps_fd = open("/proc/self/maps", O_RDONLY); if (under_root_login) { /* check for sudo and set to original user */ char *s = getenv("SUDO_GID"); if (s) { gid = cur_gid = atoi(s); if (gid) { setregid(gid, egid); } } s = getenv("SUDO_UID"); if (s) { uid = cur_uid = atoi(s); if (uid) { skip_priv_setting = under_root_login = 0; using_sudo = 1; s = getenv("SUDO_USER"); if (s) { initgroups(s, gid); setenv("USER", s, 1); } setreuid(uid, euid); } } } if (!can_do_root_stuff) { skip_priv_setting = 1; } num_groups = getgroups(0,0); groups = malloc(num_groups * sizeof(gid_t)); getgroups(num_groups,groups); if (!skip_priv_setting) _priv_off(); }
int priv_iopl(int pl) { int ret; if (PRIVS_ARE_OFF) { _priv_on(); ret = iopl(pl); _priv_off(); } else ret = iopl(pl); #ifdef X86_EMULATOR if (config.cpu_vm == CPUVM_EMU) e_priv_iopl(pl); #endif if (ret == 0) current_iopl = pl; return ret; }
void priv_init(void) { uid = cur_uid = getuid(); if (!uid) under_root_login =1; euid = cur_euid = geteuid(); if (!euid) can_do_root_stuff = 1; if (!uid) skip_priv_setting = 1; gid = cur_gid = getgid(); egid = cur_egid = getegid(); /* must store the /proc/self/exe symlink contents before dropping privs! */ dosemu_proc_self_exe = readlink_malloc("/proc/self/exe"); /* For Fedora we must also save a file descriptor to /proc/self/maps */ dosemu_proc_self_maps_fd = open("/proc/self/maps", O_RDONLY); if (under_root_login) { /* check for sudo and set to original user */ char *s = getenv("SUDO_GID"); if (s) { gid = cur_gid = atoi(s); if (gid) { setregid(gid, egid); } } s = getenv("SUDO_UID"); if (s) { uid = cur_uid = atoi(s); if (uid) { pid_t ppid; char *path; FILE *fp; size_t n; char *line; skip_priv_setting = under_root_login = 0; using_sudo = 1; s = getenv("SUDO_USER"); if (s) { initgroups(s, gid); setenv("USER", s, 1); } setreuid(uid, euid); /* retrieve $HOME from sudo's (the parent process') environment */ ppid = getppid(); if (asprintf(&path, "/proc/%d/environ", ppid) != -1) { if ((fp = fopen(path, "r"))) { line = NULL; while(getdelim(&line, &n, '\0', fp) != -1) { if(n>5 && memcmp(line, "HOME=", 5) == 0) { setenv("HOME", line+5, 1); } } free(line); fclose(fp); } free(path); } } } } if (!can_do_root_stuff) { skip_priv_setting = 1; } num_groups = getgroups(0,0); groups = malloc(num_groups * sizeof(gid_t)); getgroups(num_groups,groups); if (!skip_priv_setting) _priv_off(); }
int real_leave_priv_setting(saved_priv_status *privs) { if (skip_priv_setting) return 1; if (PRIVS_WERE_ON(privs)) return _priv_on(); return _priv_off(); }
int real_enter_priv_off(saved_priv_status *privs) { if (skip_priv_setting) return 1; push_priv(privs); return _priv_off(); }