diff options
author | Lennart Poettering <lennart@poettering.net> | 2018-10-18 16:18:01 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2018-10-18 16:23:45 +0200 |
commit | d5b3c07da6997cde496cfb09ae47693ed13e79e2 (patch) | |
tree | abec62926be638260494f900e29163bdf4a7104e | |
parent | e1b9fc23eb0fb2f67cd9e4a1209db0da2eaa0c9f (diff) | |
download | systemd-d5b3c07da6997cde496cfb09ae47693ed13e79e2.tar.gz systemd-d5b3c07da6997cde496cfb09ae47693ed13e79e2.tar.bz2 systemd-d5b3c07da6997cde496cfb09ae47693ed13e79e2.zip |
clean-ipc: FOREACH_LINE excorcism
-rw-r--r-- | src/shared/clean-ipc.c | 52 |
1 files changed, 28 insertions, 24 deletions
diff --git a/src/shared/clean-ipc.c b/src/shared/clean-ipc.c index 08dc7b9e43..f9b05ff924 100644 --- a/src/shared/clean-ipc.c +++ b/src/shared/clean-ipc.c @@ -16,6 +16,7 @@ #include <unistd.h> #include "clean-ipc.h" +#include "def.h" #include "dirent-util.h" #include "fd-util.h" #include "fileio.h" @@ -39,9 +40,8 @@ static bool match_uid_gid(uid_t subject_uid, gid_t subject_gid, uid_t delete_uid static int clean_sysvipc_shm(uid_t delete_uid, gid_t delete_gid, bool rm) { _cleanup_fclose_ FILE *f = NULL; - char line[LINE_MAX]; bool first = true; - int ret = 0; + int ret = 0, r; f = fopen("/proc/sysvipc/shm", "re"); if (!f) { @@ -51,20 +51,25 @@ static int clean_sysvipc_shm(uid_t delete_uid, gid_t delete_gid, bool rm) { return log_warning_errno(errno, "Failed to open /proc/sysvipc/shm: %m"); } - FOREACH_LINE(line, f, goto fail) { + for (;;) { + _cleanup_free_ char *line = NULL; unsigned n_attached; pid_t cpid, lpid; uid_t uid, cuid; gid_t gid, cgid; int shmid; + r = read_line(f, LONG_LINE_MAX, &line); + if (r < 0) + return log_warning_errno(errno, "Failed to read /proc/sysvipc/shm: %m"); + if (r == 0) + break; + if (first) { first = false; continue; } - truncate_nl(line); - if (sscanf(line, "%*i %i %*o %*u " PID_FMT " " PID_FMT " %u " UID_FMT " " GID_FMT " " UID_FMT " " GID_FMT, &shmid, &cpid, &lpid, &n_attached, &uid, &gid, &cuid, &cgid) != 8) continue; @@ -95,16 +100,12 @@ static int clean_sysvipc_shm(uid_t delete_uid, gid_t delete_gid, bool rm) { } return ret; - -fail: - return log_warning_errno(errno, "Failed to read /proc/sysvipc/shm: %m"); } static int clean_sysvipc_sem(uid_t delete_uid, gid_t delete_gid, bool rm) { _cleanup_fclose_ FILE *f = NULL; - char line[LINE_MAX]; bool first = true; - int ret = 0; + int ret = 0, r; f = fopen("/proc/sysvipc/sem", "re"); if (!f) { @@ -114,18 +115,23 @@ static int clean_sysvipc_sem(uid_t delete_uid, gid_t delete_gid, bool rm) { return log_warning_errno(errno, "Failed to open /proc/sysvipc/sem: %m"); } - FOREACH_LINE(line, f, goto fail) { + for (;;) { + _cleanup_free_ char *line = NULL; uid_t uid, cuid; gid_t gid, cgid; int semid; + r = read_line(f, LONG_LINE_MAX, &line); + if (r < 0) + return log_warning_errno(r, "Failed to read /proc/sysvipc/sem: %m"); + if (r == 0) + break; + if (first) { first = false; continue; } - truncate_nl(line); - if (sscanf(line, "%*i %i %*o %*u " UID_FMT " " GID_FMT " " UID_FMT " " GID_FMT, &semid, &uid, &gid, &cuid, &cgid) != 5) continue; @@ -153,16 +159,12 @@ static int clean_sysvipc_sem(uid_t delete_uid, gid_t delete_gid, bool rm) { } return ret; - -fail: - return log_warning_errno(errno, "Failed to read /proc/sysvipc/sem: %m"); } static int clean_sysvipc_msg(uid_t delete_uid, gid_t delete_gid, bool rm) { _cleanup_fclose_ FILE *f = NULL; - char line[LINE_MAX]; bool first = true; - int ret = 0; + int ret = 0, r; f = fopen("/proc/sysvipc/msg", "re"); if (!f) { @@ -172,19 +174,24 @@ static int clean_sysvipc_msg(uid_t delete_uid, gid_t delete_gid, bool rm) { return log_warning_errno(errno, "Failed to open /proc/sysvipc/msg: %m"); } - FOREACH_LINE(line, f, goto fail) { + for (;;) { + _cleanup_free_ char *line = NULL; uid_t uid, cuid; gid_t gid, cgid; pid_t cpid, lpid; int msgid; + r = read_line(f, LONG_LINE_MAX, &line); + if (r < 0) + return log_warning_errno(r, "Failed to read /proc/sysvipc/msg: %m"); + if (r == 0) + break; + if (first) { first = false; continue; } - truncate_nl(line); - if (sscanf(line, "%*i %i %*o %*u %*u " PID_FMT " " PID_FMT " " UID_FMT " " GID_FMT " " UID_FMT " " GID_FMT, &msgid, &cpid, &lpid, &uid, &gid, &cuid, &cgid) != 7) continue; @@ -212,9 +219,6 @@ static int clean_sysvipc_msg(uid_t delete_uid, gid_t delete_gid, bool rm) { } return ret; - -fail: - return log_warning_errno(errno, "Failed to read /proc/sysvipc/msg: %m"); } static int clean_posix_shm_internal(DIR *dir, uid_t uid, gid_t gid, bool rm) { |