chiark / gitweb /
journal: Don't use loginuid if it's not valid
authorColin Walters <walters@verbum.org>
Tue, 12 Feb 2013 17:24:30 +0000 (12:24 -0500)
committerLennart Poettering <lennart@poettering.net>
Wed, 13 Feb 2013 00:02:25 +0000 (01:02 +0100)
Code above this attempted to load loginuid, if this failed for
whatever reason, we'd still end up using that value (0) in place of
realuid.  Fix this by setting a bool when we know the loginuid is
valid.

This fixes journal messages showing up in per-user journals in
gnome-ostree (not configured with loginuid, but I'll shortly fix
that).

src/journal/journald-server.c

index 12a46e6bd0d3a4fd50be651fecf409e3576d4f3b..1375d7a98e2c6e2d1a7f8a8a4c19fbfa4811fa12 100644 (file)
@@ -515,6 +515,8 @@ static void dispatch_message_real(
         int r;
         char *t;
         uid_t loginuid = 0, realuid = 0;
         int r;
         char *t;
         uid_t loginuid = 0, realuid = 0;
+        uid_t journal_uid;
+        bool loginuid_valid = false;
 
         assert(s);
         assert(iovec);
 
         assert(s);
         assert(iovec);
@@ -571,9 +573,11 @@ static void dispatch_message_real(
                                 IOVEC_SET_STRING(iovec[n++], audit_session);
 
                 r = audit_loginuid_from_pid(ucred->pid, &loginuid);
                                 IOVEC_SET_STRING(iovec[n++], audit_session);
 
                 r = audit_loginuid_from_pid(ucred->pid, &loginuid);
-                if (r >= 0)
+                if (r >= 0) {
+                        loginuid_valid = true;
                         if (asprintf(&audit_loginuid, "_AUDIT_LOGINUID=%lu", (unsigned long) loginuid) >= 0)
                                 IOVEC_SET_STRING(iovec[n++], audit_loginuid);
                         if (asprintf(&audit_loginuid, "_AUDIT_LOGINUID=%lu", (unsigned long) loginuid) >= 0)
                                 IOVEC_SET_STRING(iovec[n++], audit_loginuid);
+                }
 
                 t = shortened_cgroup_path(ucred->pid);
                 if (t) {
 
                 t = shortened_cgroup_path(ucred->pid);
                 if (t) {
@@ -666,10 +670,14 @@ static void dispatch_message_real(
 
         assert(n <= m);
 
 
         assert(n <= m);
 
-        write_to_journal(s,
-                         s->split_mode == SPLIT_NONE ? 0 :
-                         (s->split_mode == SPLIT_UID ? realuid :
-                          (realuid == 0 ? 0 : loginuid)), iovec, n);
+        if (s->split_mode == SPLIT_NONE)
+                journal_uid = 0;
+        else if (s->split_mode == SPLIT_UID || realuid == 0 || !loginuid_valid)
+                journal_uid = realuid;
+        else
+                journal_uid = loginuid;
+
+        write_to_journal(s, journal_uid, iovec, n);
 }
 
 void server_driver_message(Server *s, sd_id128_t message_id, const char *format, ...) {
 }
 
 void server_driver_message(Server *s, sd_id128_t message_id, const char *format, ...) {