Преглед на файлове

lib/parse_ini.c - Cleaner and more flexible - suid

Adapted from M-P 91d04ad6 and 48025ff3 around the existing changes.
Spenser Reinhardt преди 11 години
родител
ревизия
766e8376e8
променени са 1 файла, в които са добавени 6 реда и са изтрити 19 реда
  1. 6 19
      lib/parse_ini.c

+ 6 - 19
lib/parse_ini.c

@@ -93,19 +93,10 @@ np_arg_list* np_get_defaults(const char *locator, const char *default_section){
 	np_arg_list *defaults=NULL;
 	np_ini_info i;
 	struct stat fstat;
-	uid_t euid = -1;
-	uid_t egid = -1;
-	bool is_uid_set = false;
-
-	if (getuid() != getuid()) {
-		is_uid_set = true;
-		euid = geteuid();
-		egid = getegid();
-		if (seteuid(getuid()) != 0)
-			die(STATE_UNKNOWN, "%s %s\n", _("Can't drop user permissions."), strerror(errno));
-		if (setegid(getgid()) != 0)
-			die(STATE_UNKNOWN, "%s %s\n", _("Can't drop group permissions."), strerror(errno));
-	}
+	bool is_suid_set = np_suid();
+
+	if (is_suid_set && idpriv_temp_drop() == -1) 
+		die(STATE_UNKNOWN, "%s %s\n", _("Can't drop user permissions."), strerror(errno));
 
 	parse_locator(locator, default_section, &i);
 	/* If a file was specified or if we're using the default file. */
@@ -137,12 +128,8 @@ np_arg_list* np_get_defaults(const char *locator, const char *default_section){
 	if (i.file != NULL) free(i.file);
 	free(i.stanza);
 
-	if (is_uid_set == true) {
-		if (seteuid(euid) != 0)
-			die(STATE_UNKNOWN, "%s %s\n", _("Can't restore user id."), strerror(errno));
-		if (setegid(egid) != 0)
-			die(STATE_UNKNOWN, "%s %s\n", _("Can't restore group id."), strerror(errno));
-	}
+	if (is_suid_set && idpriv_temp_restore() == -1) 
+		die(STATE_UNKNOWN, "%s %s\n", _("Can't restore user permissions."), strerror(errno));
 
 	return defaults;
 }