]> git.ipfire.org Git - thirdparty/dbus.git/commitdiff
userdb: Respect $HOME for the home directory of our own uid
authorSimon McVittie <smcv@debian.org>
Fri, 28 Jul 2017 07:38:20 +0000 (08:38 +0100)
committerSimon McVittie <smcv@debian.org>
Fri, 28 Jul 2017 15:12:24 +0000 (16:12 +0100)
This lets cooperating processes with the same value of $HOME
interoperate for DBUS_COOKIE_SHA1 by reading and writing $HOME, even
if their $HOME differs from the uid's "official" home directory
according to getpwuid(). Out of paranoia, we only do this if the uid
and the euid are equal, since if they were unequal the correct thing
to do would be ambiguous.

In particular, Debian autobuilders run as a user whose "official"
home directory in /etc/passwd is "/nonexistent", as a mechanism to
detect non-deterministic build processes that rely on the contents of
the home directory. Until now, this meant we couldn't run dbus'
build-time tests, because every test that used DBUS_COOKIE_SHA1 would
fail in this environment.

In the tests, set HOME as well as DBUS_TEST_HOMEDIR. We keep
DBUS_TEST_HOMEDIR too, because Windows doesn't use HOME, only HOMEDRIVE
and HOMEPATH.

Bug: https://bugs.freedesktop.org/show_bug.cgi?id=101960
Bug-Debian: https://bugs.debian.org/630152
Signed-off-by: Simon McVittie <smcv@debian.org>
Reviewed-by: Philip Withnall <withnall@endlessm.com>
dbus/dbus-sysdeps-unix.c
dbus/dbus-userdb.c
test/Makefile.am

index bb05957951a9f182ff9dbea1803175e29f83ae32..0146e5556564b7eb7f7c7fdb5de49095804b6f89 100644 (file)
@@ -4253,7 +4253,8 @@ _dbus_append_keyring_directory_for_credentials (DBusString      *directory,
         static dbus_bool_t already_warned = FALSE;
         if (!already_warned)
           {
-            _dbus_warn ("Using your real home directory for testing, set DBUS_TEST_HOMEDIR to avoid");
+            _dbus_warn ("Using %s for testing, set DBUS_TEST_HOMEDIR to avoid",
+                _dbus_string_get_const_data (&homedir));
             already_warned = TRUE;
           }
       }
index 5d386fafeb14bd9d30e78d6a0ab3dbf4bada4d91..4c42b7dd7cdbf64eb6ee7a408fc4b6d634b4bf1a 100644 (file)
@@ -464,6 +464,16 @@ _dbus_homedir_from_uid (dbus_uid_t         uid,
   DBusUserDatabase *db;
   const DBusUserInfo *info;
 
+  if (uid == _dbus_getuid () && uid == _dbus_geteuid ())
+    {
+      const char *from_environment;
+
+      from_environment = _dbus_getenv ("HOME");
+
+      if (from_environment != NULL)
+        return _dbus_string_append (homedir, from_environment);
+    }
+
   /* FIXME: this can't distinguish ENOMEM from other errors */
   if (!_dbus_user_database_lock_system ())
     return FALSE;
index 7f6362f39316c13d0768a2f273d9e3b0aa1b1294..2003d352165bdca8a9321ec86115c99a8c0e1005 100644 (file)
@@ -246,6 +246,7 @@ installcheck_environment = \
        export DBUS_TEST_HOMEDIR=@abs_top_builddir@/dbus; \
        export DBUS_TEST_DATADIR=$(DESTDIR)$(datadir); \
        export DBUS_TEST_UNINSTALLED=1; \
+       export HOME=@abs_top_builddir@/dbus; \
        ${NULL}
 
 # Tests in bus/config-parser.c rely on these specific values for XDG_* and
@@ -267,6 +268,7 @@ AM_TESTS_ENVIRONMENT = \
        export DBUS_TEST_EXEC=@abs_top_builddir@/test; \
        export DBUS_TEST_HOMEDIR=@abs_top_builddir@/dbus; \
        export DBUS_TEST_UNINSTALLED=1; \
+       export HOME=@abs_top_builddir@/dbus; \
        $(NULL)
 
 manual_authz_SOURCES = manual-authz.c