|
|
b8cfec9 |
Fail when dropping root privileges is not successful.
|
|
|
b8cfec9 |
|
|
|
b8cfec9 |
https://bugzilla.novell.com/show_bug.cgi?id=347822
|
|
|
b8cfec9 |
https://bugzilla.redhat.com/show_bug.cgi?id=425481
|
|
|
b8cfec9 |
|
|
|
b8cfec9 |
Lubomir Kundrak <lkundrak@redhat.com>
|
|
|
b8cfec9 |
|
|
|
b8cfec9 |
Index: src/daemon/main.c
|
|
|
b8cfec9 |
===================================================================
|
|
|
b8cfec9 |
--- src/daemon/main.c (revision 2098)
|
|
|
b8cfec9 |
+++ src/daemon/main.c (working copy)
|
|
|
b8cfec9 |
@@ -372,7 +372,8 @@
|
|
|
b8cfec9 |
pa_limit_caps();
|
|
|
b8cfec9 |
|
|
|
b8cfec9 |
/* Drop priviliges, but keep CAP_SYS_NICE */
|
|
|
b8cfec9 |
- pa_drop_root();
|
|
|
b8cfec9 |
+ if (pa_drop_root() < 0)
|
|
|
b8cfec9 |
+ goto finish;
|
|
|
b8cfec9 |
|
|
|
b8cfec9 |
/* After dropping root, the effective set is reset, hence,
|
|
|
b8cfec9 |
* let's raise it again */
|
|
|
b8cfec9 |
@@ -443,7 +444,8 @@
|
|
|
b8cfec9 |
* let's give it up early */
|
|
|
b8cfec9 |
|
|
|
b8cfec9 |
pa_drop_caps();
|
|
|
b8cfec9 |
- pa_drop_root();
|
|
|
b8cfec9 |
+ if (pa_drop_root() < 0)
|
|
|
b8cfec9 |
+ goto finish;
|
|
|
b8cfec9 |
suid_root = real_root = FALSE;
|
|
|
b8cfec9 |
|
|
|
b8cfec9 |
if (conf->high_priority || conf->realtime_scheduling)
|
|
|
b8cfec9 |
@@ -497,7 +499,8 @@
|
|
|
b8cfec9 |
|
|
|
b8cfec9 |
if (drop) {
|
|
|
b8cfec9 |
pa_drop_caps();
|
|
|
b8cfec9 |
- pa_drop_root();
|
|
|
b8cfec9 |
+ if (pa_drop_root() < 0)
|
|
|
b8cfec9 |
+ goto finish;
|
|
|
b8cfec9 |
suid_root = real_root = FALSE;
|
|
|
b8cfec9 |
}
|
|
|
b8cfec9 |
}
|
|
|
b8cfec9 |
Index: src/daemon/caps.c
|
|
|
b8cfec9 |
===================================================================
|
|
|
b8cfec9 |
--- src/daemon/caps.c (revision 2098)
|
|
|
b8cfec9 |
+++ src/daemon/caps.c (working copy)
|
|
|
b8cfec9 |
@@ -54,27 +54,36 @@
|
|
|
b8cfec9 |
#ifdef HAVE_GETUID
|
|
|
b8cfec9 |
|
|
|
b8cfec9 |
/* Drop root rights when called SUID root */
|
|
|
b8cfec9 |
-void pa_drop_root(void) {
|
|
|
b8cfec9 |
+int pa_drop_root(void) {
|
|
|
b8cfec9 |
uid_t uid = getuid();
|
|
|
b8cfec9 |
+ int error = 0;
|
|
|
b8cfec9 |
|
|
|
b8cfec9 |
if (uid == 0 || geteuid() != 0)
|
|
|
b8cfec9 |
- return;
|
|
|
b8cfec9 |
+ return 0;
|
|
|
b8cfec9 |
|
|
|
b8cfec9 |
pa_log_info("Dropping root priviliges.");
|
|
|
b8cfec9 |
|
|
|
b8cfec9 |
#if defined(HAVE_SETRESUID)
|
|
|
b8cfec9 |
- setresuid(uid, uid, uid);
|
|
|
b8cfec9 |
+ error += setresuid(uid, uid, uid);
|
|
|
b8cfec9 |
#elif defined(HAVE_SETREUID)
|
|
|
b8cfec9 |
- setreuid(uid, uid);
|
|
|
b8cfec9 |
+ error += setreuid(uid, uid);
|
|
|
b8cfec9 |
#else
|
|
|
b8cfec9 |
- setuid(uid);
|
|
|
b8cfec9 |
- seteuid(uid);
|
|
|
b8cfec9 |
+ error += setuid(uid);
|
|
|
b8cfec9 |
+ error += seteuid(uid);
|
|
|
b8cfec9 |
#endif
|
|
|
b8cfec9 |
+
|
|
|
b8cfec9 |
+ if (error != 0) {
|
|
|
b8cfec9 |
+ pa_log_error("Could not drop root priviliges.");
|
|
|
b8cfec9 |
+ return -1;
|
|
|
b8cfec9 |
+ }
|
|
|
b8cfec9 |
+
|
|
|
b8cfec9 |
+ return 0;
|
|
|
b8cfec9 |
}
|
|
|
b8cfec9 |
|
|
|
b8cfec9 |
#else
|
|
|
b8cfec9 |
|
|
|
b8cfec9 |
-void pa_drop_root(void) {
|
|
|
b8cfec9 |
+int pa_drop_root(void) {
|
|
|
b8cfec9 |
+ return 0;
|
|
|
b8cfec9 |
}
|
|
|
b8cfec9 |
|
|
|
b8cfec9 |
#endif
|
|
|
b8cfec9 |
@@ -142,8 +151,7 @@
|
|
|
b8cfec9 |
}
|
|
|
b8cfec9 |
|
|
|
b8cfec9 |
int pa_drop_caps(void) {
|
|
|
b8cfec9 |
- pa_drop_root();
|
|
|
b8cfec9 |
- return 0;
|
|
|
b8cfec9 |
+ return pa_drop_root();
|
|
|
b8cfec9 |
}
|
|
|
b8cfec9 |
|
|
|
b8cfec9 |
#endif
|
|
|
b8cfec9 |
Index: src/daemon/caps.h
|
|
|
b8cfec9 |
===================================================================
|
|
|
b8cfec9 |
--- src/daemon/caps.h (revision 2098)
|
|
|
b8cfec9 |
+++ src/daemon/caps.h (working copy)
|
|
|
b8cfec9 |
@@ -24,7 +24,7 @@
|
|
|
b8cfec9 |
USA.
|
|
|
b8cfec9 |
***/
|
|
|
b8cfec9 |
|
|
|
b8cfec9 |
-void pa_drop_root(void);
|
|
|
b8cfec9 |
+int pa_drop_root(void);
|
|
|
b8cfec9 |
int pa_limit_caps(void);
|
|
|
b8cfec9 |
int pa_drop_caps(void);
|
|
|
b8cfec9 |
|