Merge pull request #7846 from poettering/nobody-getenv
some assorted fixes and additions, in particular a way to turn off "nobody" synthesizing on a specific system
This commit is contained in:
+3
-6
@@ -1225,8 +1225,7 @@ int tempfn_xxxxxx(const char *p, const char *extra, char **ret) {
|
||||
if (!filename_is_valid(fn))
|
||||
return -EINVAL;
|
||||
|
||||
if (!extra)
|
||||
extra = "";
|
||||
extra = strempty(extra);
|
||||
|
||||
t = new(char, strlen(p) + 2 + strlen(extra) + 6 + 1);
|
||||
if (!t)
|
||||
@@ -1259,8 +1258,7 @@ int tempfn_random(const char *p, const char *extra, char **ret) {
|
||||
if (!filename_is_valid(fn))
|
||||
return -EINVAL;
|
||||
|
||||
if (!extra)
|
||||
extra = "";
|
||||
extra = strempty(extra);
|
||||
|
||||
t = new(char, strlen(p) + 2 + strlen(extra) + 16 + 1);
|
||||
if (!t)
|
||||
@@ -1300,8 +1298,7 @@ int tempfn_random_child(const char *p, const char *extra, char **ret) {
|
||||
return r;
|
||||
}
|
||||
|
||||
if (!extra)
|
||||
extra = "";
|
||||
extra = strempty(extra);
|
||||
|
||||
t = new(char, strlen(p) + 3 + strlen(extra) + 16 + 1);
|
||||
if (!t)
|
||||
|
||||
+3
-1
@@ -29,6 +29,7 @@
|
||||
#include <unistd.h>
|
||||
|
||||
#include "time-util.h"
|
||||
#include "util.h"
|
||||
|
||||
int unlink_noerrno(const char *path);
|
||||
|
||||
@@ -89,13 +90,14 @@ int chase_symlinks(const char *path_with_prefix, const char *root, unsigned flag
|
||||
|
||||
/* Useful for usage with _cleanup_(), removes a directory and frees the pointer */
|
||||
static inline void rmdir_and_free(char *p) {
|
||||
PROTECT_ERRNO;
|
||||
(void) rmdir(p);
|
||||
free(p);
|
||||
}
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(char*, rmdir_and_free);
|
||||
|
||||
static inline void unlink_and_free(char *p) {
|
||||
(void) unlink(p);
|
||||
(void) unlink_noerrno(p);
|
||||
free(p);
|
||||
}
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(char*, unlink_and_free);
|
||||
|
||||
@@ -796,6 +796,8 @@ void sigkill_wait(pid_t pid) {
|
||||
}
|
||||
|
||||
void sigkill_waitp(pid_t *pid) {
|
||||
PROTECT_ERRNO;
|
||||
|
||||
if (!pid)
|
||||
return;
|
||||
if (*pid <= 1)
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "util.h"
|
||||
|
||||
typedef enum RemoveFlags {
|
||||
REMOVE_ONLY_DIRECTORIES = 1,
|
||||
REMOVE_ROOT = 2,
|
||||
@@ -34,6 +36,7 @@ int rm_rf(const char *path, RemoveFlags flags);
|
||||
|
||||
/* Useful for usage with _cleanup_(), destroys a directory and frees the pointer */
|
||||
static inline void rm_rf_physical_and_free(char *p) {
|
||||
PROTECT_ERRNO;
|
||||
(void) rm_rf(p, REMOVE_ROOT|REMOVE_PHYSICAL);
|
||||
free(p);
|
||||
}
|
||||
|
||||
@@ -52,15 +52,15 @@ static inline bool streq_ptr(const char *a, const char *b) {
|
||||
}
|
||||
|
||||
static inline const char* strempty(const char *s) {
|
||||
return s ? s : "";
|
||||
return s ?: "";
|
||||
}
|
||||
|
||||
static inline const char* strnull(const char *s) {
|
||||
return s ? s : "(null)";
|
||||
return s ?: "(null)";
|
||||
}
|
||||
|
||||
static inline const char *strna(const char *s) {
|
||||
return s ? s : "n/a";
|
||||
return s ?: "n/a";
|
||||
}
|
||||
|
||||
static inline bool isempty(const char *p) {
|
||||
|
||||
+33
-6
@@ -137,7 +137,8 @@ int get_user_creds(
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (STR_IN_SET(*username, NOBODY_USER_NAME, "65534")) {
|
||||
if (synthesize_nobody() &&
|
||||
STR_IN_SET(*username, NOBODY_USER_NAME, "65534")) {
|
||||
*username = NOBODY_USER_NAME;
|
||||
|
||||
if (uid)
|
||||
@@ -243,7 +244,8 @@ int get_group_creds(const char **groupname, gid_t *gid) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (STR_IN_SET(*groupname, NOBODY_GROUP_NAME, "65534")) {
|
||||
if (synthesize_nobody() &&
|
||||
STR_IN_SET(*groupname, NOBODY_GROUP_NAME, "65534")) {
|
||||
*groupname = NOBODY_GROUP_NAME;
|
||||
|
||||
if (gid)
|
||||
@@ -283,7 +285,8 @@ char* uid_to_name(uid_t uid) {
|
||||
/* Shortcut things to avoid NSS lookups */
|
||||
if (uid == 0)
|
||||
return strdup("root");
|
||||
if (uid == UID_NOBODY)
|
||||
if (synthesize_nobody() &&
|
||||
uid == UID_NOBODY)
|
||||
return strdup(NOBODY_USER_NAME);
|
||||
|
||||
if (uid_is_valid(uid)) {
|
||||
@@ -323,7 +326,8 @@ char* gid_to_name(gid_t gid) {
|
||||
|
||||
if (gid == 0)
|
||||
return strdup("root");
|
||||
if (gid == GID_NOBODY)
|
||||
if (synthesize_nobody() &&
|
||||
gid == GID_NOBODY)
|
||||
return strdup(NOBODY_GROUP_NAME);
|
||||
|
||||
if (gid_is_valid(gid)) {
|
||||
@@ -427,7 +431,8 @@ int get_home_dir(char **_h) {
|
||||
*_h = h;
|
||||
return 0;
|
||||
}
|
||||
if (u == UID_NOBODY) {
|
||||
if (synthesize_nobody() &&
|
||||
u == UID_NOBODY) {
|
||||
h = strdup("/");
|
||||
if (!h)
|
||||
return -ENOMEM;
|
||||
@@ -482,7 +487,8 @@ int get_shell(char **_s) {
|
||||
*_s = s;
|
||||
return 0;
|
||||
}
|
||||
if (u == UID_NOBODY) {
|
||||
if (synthesize_nobody() &&
|
||||
u == UID_NOBODY) {
|
||||
s = strdup("/sbin/nologin");
|
||||
if (!s)
|
||||
return -ENOMEM;
|
||||
@@ -690,3 +696,24 @@ int maybe_setgroups(size_t size, const gid_t *list) {
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool synthesize_nobody(void) {
|
||||
|
||||
#ifdef NOLEGACY
|
||||
return true;
|
||||
#else
|
||||
/* Returns true when we shall synthesize the "nobody" user (which we do by default). This can be turned off by
|
||||
* touching /etc/systemd/dont-synthesize-nobody in order to provide upgrade compatibility with legacy systems
|
||||
* that used the "nobody" user name and group name for other UIDs/GIDs than 65534.
|
||||
*
|
||||
* Note that we do not employ any kind of synchronization on the following caching variable. If the variable is
|
||||
* accessed in multi-threaded programs in the worst case it might happen that we initialize twice, but that
|
||||
* shouldn't matter as each initialization should come to the same result. */
|
||||
static int cache = -1;
|
||||
|
||||
if (cache < 0)
|
||||
cache = access("/etc/systemd/dont-synthesize-nobody", F_OK) < 0;
|
||||
|
||||
return cache;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -97,3 +97,5 @@ bool valid_gecos(const char *d);
|
||||
bool valid_home(const char *p);
|
||||
|
||||
int maybe_setgroups(size_t size, const gid_t *list);
|
||||
|
||||
bool synthesize_nobody(void);
|
||||
|
||||
+9
-3
@@ -618,7 +618,13 @@ int str_verscmp(const char *s1, const char *s2) {
|
||||
}
|
||||
|
||||
/* Turn off core dumps but only if we're running outside of a container. */
|
||||
void disable_core_dumps(void) {
|
||||
if (detect_container() <= 0)
|
||||
(void) write_string_file("/proc/sys/kernel/core_pattern", "|/bin/false", 0);
|
||||
void disable_coredumps(void) {
|
||||
int r;
|
||||
|
||||
if (detect_container() > 0)
|
||||
return;
|
||||
|
||||
r = write_string_file("/proc/sys/kernel/core_pattern", "|/bin/false", 0);
|
||||
if (r < 0)
|
||||
log_debug_errno(r, "Failed to turn off coredumps, ignoring: %m");
|
||||
}
|
||||
|
||||
+1
-1
@@ -192,4 +192,4 @@ int version(void);
|
||||
|
||||
int str_verscmp(const char *s1, const char *s2);
|
||||
|
||||
void disable_core_dumps(void);
|
||||
void disable_coredumps(void);
|
||||
|
||||
Reference in New Issue
Block a user