mirror of
https://github.com/systemd/systemd.git
synced 2024-10-27 01:55:22 +03:00
shared: procfs_file_alloca: handle pid==0
when pid is set to 0 use /proc/self
This commit is contained in:
parent
9dddaedfcc
commit
b68fa010f7
@ -33,7 +33,8 @@
|
|||||||
|
|
||||||
static bool ignore_proc(pid_t pid) {
|
static bool ignore_proc(pid_t pid) {
|
||||||
_cleanup_fclose_ FILE *f = NULL;
|
_cleanup_fclose_ FILE *f = NULL;
|
||||||
char c, *p;
|
char c;
|
||||||
|
const char *p;
|
||||||
size_t count;
|
size_t count;
|
||||||
uid_t uid;
|
uid_t uid;
|
||||||
int r;
|
int r;
|
||||||
|
@ -46,10 +46,7 @@ int audit_session_from_pid(pid_t pid, uint32_t *id) {
|
|||||||
if (detect_container(NULL) > 0)
|
if (detect_container(NULL) > 0)
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
|
|
||||||
if (pid == 0)
|
p = procfs_file_alloca(pid, "sessionid");
|
||||||
p = "/proc/self/sessionid";
|
|
||||||
else
|
|
||||||
p = procfs_file_alloca(pid, "sessionid");
|
|
||||||
|
|
||||||
r = read_one_line_file(p, &s);
|
r = read_one_line_file(p, &s);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
@ -78,10 +75,7 @@ int audit_loginuid_from_pid(pid_t pid, uid_t *uid) {
|
|||||||
if (detect_container(NULL) > 0)
|
if (detect_container(NULL) > 0)
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
|
|
||||||
if (pid == 0)
|
p = procfs_file_alloca(pid, "loginuid");
|
||||||
p = "/proc/self/loginuid";
|
|
||||||
else
|
|
||||||
p = procfs_file_alloca(pid, "loginuid");
|
|
||||||
|
|
||||||
r = read_one_line_file(p, &s);
|
r = read_one_line_file(p, &s);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
|
@ -746,10 +746,7 @@ int cg_pid_get_path(const char *controller, pid_t pid, char **path) {
|
|||||||
} else
|
} else
|
||||||
controller = SYSTEMD_CGROUP_CONTROLLER;
|
controller = SYSTEMD_CGROUP_CONTROLLER;
|
||||||
|
|
||||||
if (pid == 0)
|
fs = procfs_file_alloca(pid, "cgroup");
|
||||||
fs = "/proc/self/cgroup";
|
|
||||||
else
|
|
||||||
fs = procfs_file_alloca(pid, "cgroup");
|
|
||||||
|
|
||||||
f = fopen(fs, "re");
|
f = fopen(fs, "re");
|
||||||
if (!f)
|
if (!f)
|
||||||
|
@ -495,10 +495,7 @@ int get_starttime_of_pid(pid_t pid, unsigned long long *st) {
|
|||||||
assert(pid >= 0);
|
assert(pid >= 0);
|
||||||
assert(st);
|
assert(st);
|
||||||
|
|
||||||
if (pid == 0)
|
p = procfs_file_alloca(pid, "stat");
|
||||||
p = "/proc/self/stat";
|
|
||||||
else
|
|
||||||
p = procfs_file_alloca(pid, "stat");
|
|
||||||
|
|
||||||
f = fopen(p, "re");
|
f = fopen(p, "re");
|
||||||
if (!f)
|
if (!f)
|
||||||
@ -573,10 +570,7 @@ int get_process_comm(pid_t pid, char **name) {
|
|||||||
assert(name);
|
assert(name);
|
||||||
assert(pid >= 0);
|
assert(pid >= 0);
|
||||||
|
|
||||||
if (pid == 0)
|
p = procfs_file_alloca(pid, "comm");
|
||||||
p = "/proc/self/comm";
|
|
||||||
else
|
|
||||||
p = procfs_file_alloca(pid, "comm");
|
|
||||||
|
|
||||||
r = read_one_line_file(p, name);
|
r = read_one_line_file(p, name);
|
||||||
if (r == -ENOENT)
|
if (r == -ENOENT)
|
||||||
@ -594,10 +588,7 @@ int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char *
|
|||||||
assert(line);
|
assert(line);
|
||||||
assert(pid >= 0);
|
assert(pid >= 0);
|
||||||
|
|
||||||
if (pid == 0)
|
p = procfs_file_alloca(pid, "cmdline");
|
||||||
p = "/proc/self/cmdline";
|
|
||||||
else
|
|
||||||
p = procfs_file_alloca(pid, "cmdline");
|
|
||||||
|
|
||||||
f = fopen(p, "re");
|
f = fopen(p, "re");
|
||||||
if (!f)
|
if (!f)
|
||||||
@ -716,10 +707,7 @@ int get_process_capeff(pid_t pid, char **capeff) {
|
|||||||
assert(capeff);
|
assert(capeff);
|
||||||
assert(pid >= 0);
|
assert(pid >= 0);
|
||||||
|
|
||||||
if (pid == 0)
|
p = procfs_file_alloca(pid, "status");
|
||||||
p = "/proc/self/status";
|
|
||||||
else
|
|
||||||
p = procfs_file_alloca(pid, "status");
|
|
||||||
|
|
||||||
return get_status_field(p, "\nCapEff:", capeff);
|
return get_status_field(p, "\nCapEff:", capeff);
|
||||||
}
|
}
|
||||||
@ -732,10 +720,7 @@ int get_process_exe(pid_t pid, char **name) {
|
|||||||
assert(pid >= 0);
|
assert(pid >= 0);
|
||||||
assert(name);
|
assert(name);
|
||||||
|
|
||||||
if (pid == 0)
|
p = procfs_file_alloca(pid, "exe");
|
||||||
p = "/proc/self/exe";
|
|
||||||
else
|
|
||||||
p = procfs_file_alloca(pid, "exe");
|
|
||||||
|
|
||||||
r = readlink_malloc(p, name);
|
r = readlink_malloc(p, name);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
@ -2549,10 +2534,7 @@ int get_ctty_devnr(pid_t pid, dev_t *d) {
|
|||||||
|
|
||||||
assert(pid >= 0);
|
assert(pid >= 0);
|
||||||
|
|
||||||
if (pid == 0)
|
fn = procfs_file_alloca(pid, "stat");
|
||||||
fn = "/proc/self/stat";
|
|
||||||
else
|
|
||||||
fn = procfs_file_alloca(pid, "stat");
|
|
||||||
|
|
||||||
f = fopen(fn, "re");
|
f = fopen(fn, "re");
|
||||||
if (!f)
|
if (!f)
|
||||||
@ -5095,10 +5077,7 @@ int getenv_for_pid(pid_t pid, const char *field, char **_value) {
|
|||||||
assert(field);
|
assert(field);
|
||||||
assert(_value);
|
assert(_value);
|
||||||
|
|
||||||
if (pid == 0)
|
path = procfs_file_alloca(pid, "environ");
|
||||||
path = "/proc/self/environ";
|
|
||||||
else
|
|
||||||
path = procfs_file_alloca(pid, "environ");
|
|
||||||
|
|
||||||
f = fopen(path, "re");
|
f = fopen(path, "re");
|
||||||
if (!f)
|
if (!f)
|
||||||
|
@ -777,9 +777,13 @@ int unlink_noerrno(const char *path);
|
|||||||
#define procfs_file_alloca(pid, field) \
|
#define procfs_file_alloca(pid, field) \
|
||||||
({ \
|
({ \
|
||||||
pid_t _pid_ = (pid); \
|
pid_t _pid_ = (pid); \
|
||||||
char *_r_; \
|
const char *_r_; \
|
||||||
_r_ = alloca(sizeof("/proc/") -1 + DECIMAL_STR_MAX(pid_t) + 1 + sizeof(field)); \
|
if (_pid_ == 0) { \
|
||||||
sprintf(_r_, "/proc/"PID_FMT"/" field, _pid_); \
|
_r_ = ("/proc/self/" field); \
|
||||||
|
} else { \
|
||||||
|
_r_ = alloca(strlen("/proc/") + DECIMAL_STR_MAX(pid_t) + 1 + sizeof(field)); \
|
||||||
|
sprintf((char*) _r_, "/proc/"PID_FMT"/" field, _pid_); \
|
||||||
|
} \
|
||||||
_r_; \
|
_r_; \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user