From: Lennart Poettering Date: Thu, 23 Aug 2012 16:47:01 +0000 (+0200) Subject: shared: in code that might get called from suid programs use __secure_getenv() rather... X-Git-Tag: v190~190 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=88fae6e0441d4195e089434f07d3e7fd811d6297 shared: in code that might get called from suid programs use __secure_getenv() rather than getenv() It's better to be safe than sorry. --- diff --git a/TODO b/TODO index b1b57d66f..a4643d7b8 100644 --- a/TODO +++ b/TODO @@ -65,8 +65,6 @@ Features: * maybe make systemd-detect-virt suid? or use fscaps? -* consider using __secure_getenv() instead of getenv() in libs - * man: document in ExecStart= explicitly that we don't take shell command lines, only executable names with arguments * shutdown: don't read-only mount anything when running in container @@ -505,6 +503,8 @@ Regularly: * set_put(), hashmap_put() return values check. i.e. == 0 doesn't free()! +* use __secure_getenv() instead of getenv() where appropriate + Scheduled for removal (or fixing): * xxxOverridable dependencies diff --git a/src/core/dbus.c b/src/core/dbus.c index 9db172b6e..1fc714823 100644 --- a/src/core/dbus.c +++ b/src/core/dbus.c @@ -955,12 +955,12 @@ static DBusConnection* manager_bus_connect_private(Manager *m, DBusBusType type) switch (type) { case DBUS_BUS_SYSTEM: - address = getenv("DBUS_SYSTEM_BUS_ADDRESS"); + address = __secure_getenv("DBUS_SYSTEM_BUS_ADDRESS"); if (!address || !address[0]) address = DBUS_SYSTEM_BUS_DEFAULT_ADDRESS; break; case DBUS_BUS_SESSION: - address = getenv("DBUS_SESSION_BUS_ADDRESS"); + address = __secure_getenv("DBUS_SESSION_BUS_ADDRESS"); if (!address || !address[0]) address = DBUS_SESSION_BUS_DEFAULT_ADDRESS; break; @@ -1077,7 +1077,7 @@ static int bus_init_private(Manager *m) { const char *e; char *p; - e = getenv("XDG_RUNTIME_DIR"); + e = __secure_getenv("XDG_RUNTIME_DIR"); if (!e) return 0; diff --git a/src/libudev/libudev.c b/src/libudev/libudev.c index 07a24d5c3..1a7480841 100644 --- a/src/libudev/libudev.c +++ b/src/libudev/libudev.c @@ -191,7 +191,7 @@ _public_ struct udev *udev_new(void) } /* environment overrides config */ - env = getenv("UDEV_LOG"); + env = __secure_getenv("UDEV_LOG"); if (env != NULL) udev_set_log_priority(udev, util_log_priority(env)); diff --git a/src/shared/dbus-common.c b/src/shared/dbus-common.c index da2dc2e98..8d7c4620c 100644 --- a/src/shared/dbus-common.c +++ b/src/shared/dbus-common.c @@ -121,7 +121,7 @@ int bus_connect(DBusBusType t, DBusConnection **_bus, bool *_private, DBusError * try via XDG_RUNTIME_DIR first, then * fallback to normal bus access */ - e = getenv("XDG_RUNTIME_DIR"); + e = __secure_getenv("XDG_RUNTIME_DIR"); if (e) { char *p; diff --git a/src/shared/log.c b/src/shared/log.c index 1cbc9d625..4fc430eed 100644 --- a/src/shared/log.c +++ b/src/shared/log.c @@ -688,21 +688,21 @@ int log_set_max_level_from_string(const char *e) { void log_parse_environment(void) { const char *e; - if ((e = getenv("SYSTEMD_LOG_TARGET"))) - if (log_set_target_from_string(e) < 0) - log_warning("Failed to parse log target %s. Ignoring.", e); + e = __secure_getenv("SYSTEMD_LOG_TARGET"); + if (e && log_set_target_from_string(e) < 0) + log_warning("Failed to parse log target %s. Ignoring.", e); - if ((e = getenv("SYSTEMD_LOG_LEVEL"))) - if (log_set_max_level_from_string(e) < 0) - log_warning("Failed to parse log level %s. Ignoring.", e); + e = __secure_getenv("SYSTEMD_LOG_LEVEL"); + if (e && log_set_max_level_from_string(e) < 0) + log_warning("Failed to parse log level %s. Ignoring.", e); - if ((e = getenv("SYSTEMD_LOG_COLOR"))) - if (log_show_color_from_string(e) < 0) - log_warning("Failed to parse bool %s. Ignoring.", e); + e = __secure_getenv("SYSTEMD_LOG_COLOR"); + if (e && log_show_color_from_string(e) < 0) + log_warning("Failed to parse bool %s. Ignoring.", e); - if ((e = getenv("SYSTEMD_LOG_LOCATION"))) - if (log_show_location_from_string(e) < 0) - log_warning("Failed to parse bool %s. Ignoring.", e); + e = __secure_getenv("SYSTEMD_LOG_LOCATION"); + if (e && log_show_location_from_string(e) < 0) + log_warning("Failed to parse bool %s. Ignoring.", e); } LogTarget log_get_target(void) {