From: Simon McVittie Date: Tue, 2 Jul 2019 19:42:54 +0000 (+0100) Subject: tests: Skip system bus test if we are root but messagebus does not exist X-Git-Tag: dbus-1.13.14~27^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=505bbfe4bd2ced20d8637356b431fefded71b2c3;p=thirdparty%2Fdbus.git tests: Skip system bus test if we are root but messagebus does not exist Some CI systems do the build as root in a disposable container, and run tests without ever having installed dbus. This means we can't expect to be able to drop privileges from root to the DBUS_USER (usually named messagebus or dbus) unless we have checked that the DBUS_USER exists. Signed-off-by: Simon McVittie --- diff --git a/test/dbus-daemon.c b/test/dbus-daemon.c index 664479559..e8bdace3c 100644 --- a/test/dbus-daemon.c +++ b/test/dbus-daemon.c @@ -2653,7 +2653,7 @@ static Config as_another_user_config = { NULL, 1, "valid-config-files/as-another-user.conf", /* We start the dbus-daemon as root and drop privileges, like the * real system bus does */ - TEST_USER_ROOT, SPECIFY_ADDRESS + TEST_USER_ROOT_DROP_TO_MESSAGEBUS, SPECIFY_ADDRESS }; #ifdef ENABLE_TRADITIONAL_ACTIVATION diff --git a/test/test-utils-glib.c b/test/test-utils-glib.c index 083c9bfcd..7cc92bc72 100644 --- a/test/test-utils-glib.c +++ b/test/test-utils-glib.c @@ -126,6 +126,7 @@ spawn_dbus_daemon (const gchar *binary, case TEST_USER_ROOT: break; + case TEST_USER_ROOT_DROP_TO_MESSAGEBUS: case TEST_USER_MESSAGEBUS: pwd = getpwnam (DBUS_USER); @@ -139,6 +140,13 @@ spawn_dbus_daemon (const gchar *binary, return NULL; } + if (user == TEST_USER_ROOT_DROP_TO_MESSAGEBUS) + { + /* Let the dbus-daemon start as root and drop privileges + * itself */ + pwd = NULL; + } + break; case TEST_USER_OTHER: @@ -399,6 +407,11 @@ become_other_user (TestUser user, username = DBUS_TEST_USER; break; + /* TEST_USER_ROOT_DROP_TO_MESSAGEBUS is only meaningful for + * test_get_dbus_daemon(), not as a client */ + case TEST_USER_ROOT_DROP_TO_MESSAGEBUS: + g_return_val_if_reached (FALSE); + case TEST_USER_ME: default: g_return_val_if_reached (FALSE); @@ -445,6 +458,11 @@ become_other_user (TestUser user, "credentials-passing semantics on this platform"); return FALSE; + /* TEST_USER_ROOT_DROP_TO_MESSAGEBUS is only meaningful for + * test_get_dbus_daemon(), not as a client */ + case TEST_USER_ROOT_DROP_TO_MESSAGEBUS: + g_return_val_if_reached (FALSE); + case TEST_USER_ME: default: g_return_val_if_reached (FALSE); diff --git a/test/test-utils-glib.h b/test/test-utils-glib.h index ce8171bd1..c4a2c5436 100644 --- a/test/test-utils-glib.h +++ b/test/test-utils-glib.h @@ -45,8 +45,8 @@ * be run as an arbitrary non-root user, as above. * * Certain tests can usefully be run again, as root. When this is done, - * tests using TEST_USER_ROOT, TEST_USER_MESSAGEBUS and/or TEST_USER_OTHER - * can exercise situations that only arise when there's more than one uid. + * tests using a TestUser other than TEST_USER_ME can exercise situations + * that only arise when there's more than one uid. */ typedef enum { /* Whatever user happens to be running the regression test; @@ -58,6 +58,11 @@ typedef enum { * from configure.ac, usually 'messagebus' but perhaps 'dbus' or * '_dbus'. */ TEST_USER_MESSAGEBUS, + /* Run as uid 0, expecting to drop privileges to the user who would + * normally run the system bus (so we must skip the test if that user + * doesn't exist). Only valid for test_get_dbus_daemon(), not for + * test_connect_to_bus_as_user(). */ + TEST_USER_ROOT_DROP_TO_MESSAGEBUS, /* An unprivileged user who is neither root nor DBUS_USER. * This is DBUS_TEST_USER from configure.ac, usually 'nobody'. */ TEST_USER_OTHER