From 7d5e9c0f60cddf01ec803012cbdc02d2f55b78c1 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 19 Sep 2012 22:21:09 +0200 Subject: [PATCH] util: define union dirent_storage and make use of it everywhere Make sure to allocate enough space for readdir_r(). https://bugzilla.redhat.com/show_bug.cgi?id=858754 --- src/delta/delta.c | 5 +++-- src/journal/journal-vacuum.c | 5 +++-- src/journal/journald.c | 5 +++-- src/journal/sd-journal.c | 10 ++++++---- src/login/sd-login.c | 5 +++-- src/shared/conf-files.c | 5 +++-- src/shared/hwclock.c | 5 +++-- src/shared/install.c | 15 +++++++++------ src/shared/util.c | 15 +++++++++------ src/shared/util.h | 7 +++++++ src/tmpfiles/tmpfiles.c | 5 +++-- 11 files changed, 52 insertions(+), 30 deletions(-) diff --git a/src/delta/delta.c b/src/delta/delta.c index eef6536b0..803d2a7fc 100644 --- a/src/delta/delta.c +++ b/src/delta/delta.c @@ -176,11 +176,12 @@ static int enumerate_dir(Hashmap *top, Hashmap *bottom, const char *path) { } for (;;) { - struct dirent *de, buf; + struct dirent *de; + union dirent_storage buf; int k; char *p; - k = readdir_r(d, &buf, &de); + k = readdir_r(d, &buf.de, &de); if (k != 0) { r = -k; goto finish; diff --git a/src/journal/journal-vacuum.c b/src/journal/journal-vacuum.c index c89014653..ac16bdfcf 100644 --- a/src/journal/journal-vacuum.c +++ b/src/journal/journal-vacuum.c @@ -86,7 +86,8 @@ int journal_directory_vacuum(const char *directory, uint64_t max_use, uint64_t m for (;;) { int k; - struct dirent buf, *de; + struct dirent *de; + union dirent_storage buf; size_t q; struct stat st; char *p; @@ -94,7 +95,7 @@ int journal_directory_vacuum(const char *directory, uint64_t max_use, uint64_t m sd_id128_t seqnum_id; bool have_seqnum; - k = readdir_r(d, &buf, &de); + k = readdir_r(d, &buf.de, &de); if (k != 0) { r = -k; goto finish; diff --git a/src/journal/journald.c b/src/journal/journald.c index 74c80f5a0..164e1087d 100644 --- a/src/journal/journald.c +++ b/src/journal/journald.c @@ -141,9 +141,10 @@ static uint64_t available_space(Server *s) { for (;;) { struct stat st; - struct dirent buf, *de; + struct dirent *de; + union dirent_storage buf; - r = readdir_r(d, &buf, &de); + r = readdir_r(d, &buf.de, &de); if (r != 0) break; diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c index 2fa81727e..acde84fe2 100644 --- a/src/journal/sd-journal.c +++ b/src/journal/sd-journal.c @@ -1256,9 +1256,10 @@ static int add_directory(sd_journal *j, const char *prefix, const char *dirname) } for (;;) { - struct dirent buf, *de; + struct dirent *de; + union dirent_storage buf; - r = readdir_r(d, &buf, &de); + r = readdir_r(d, &buf.de, &de); if (r != 0 || !de) break; @@ -1334,10 +1335,11 @@ static int add_root_directory(sd_journal *j, const char *p) { } for (;;) { - struct dirent buf, *de; + struct dirent *de; + union dirent_storage buf; sd_id128_t id; - r = readdir_r(d, &buf, &de); + r = readdir_r(d, &buf.de, &de); if (r != 0 || !de) break; diff --git a/src/login/sd-login.c b/src/login/sd-login.c index 82fe2ce3e..45e3bb8dc 100644 --- a/src/login/sd-login.c +++ b/src/login/sd-login.c @@ -651,11 +651,12 @@ _public_ int sd_get_uids(uid_t **users) { return -errno; for (;;) { - struct dirent buffer, *de; + struct dirent *de; + union dirent_storage buf; int k; uid_t uid; - k = readdir_r(d, &buffer, &de); + k = readdir_r(d, &buf.de, &de); if (k != 0) { r = -k; goto finish; diff --git a/src/shared/conf-files.c b/src/shared/conf-files.c index 83e4cce15..34b86293d 100644 --- a/src/shared/conf-files.c +++ b/src/shared/conf-files.c @@ -39,7 +39,6 @@ static int files_add(Hashmap *h, const char *path, const char *suffix) { DIR *dir; - struct dirent buffer, *de; int r = 0; dir = opendir(path); @@ -50,10 +49,12 @@ static int files_add(Hashmap *h, const char *path, const char *suffix) { } for (;;) { + struct dirent *de; + union dirent_storage buf; int k; char *p; - k = readdir_r(dir, &buffer, &de); + k = readdir_r(dir, &buf.de, &de); if (k != 0) { r = -k; goto finish; diff --git a/src/shared/hwclock.c b/src/shared/hwclock.c index 67eb2eff8..b93855d95 100644 --- a/src/shared/hwclock.c +++ b/src/shared/hwclock.c @@ -61,10 +61,11 @@ static int rtc_open(int flags) { for (;;) { char *p, *v; - struct dirent buf, *de; + struct dirent *de; + union dirent_storage buf; int r; - r = readdir_r(d, &buf, &de); + r = readdir_r(d, &buf.de, &de); if (r != 0) goto fallback; diff --git a/src/shared/install.c b/src/shared/install.c index f30bf8317..a99c757ea 100644 --- a/src/shared/install.c +++ b/src/shared/install.c @@ -201,7 +201,6 @@ static int remove_marked_symlinks_fd( int r = 0; DIR *d; - struct dirent buffer, *de; assert(remove_symlinks_to); assert(fd >= 0); @@ -218,9 +217,11 @@ static int remove_marked_symlinks_fd( rewinddir(d); for (;;) { + struct dirent *de; + union dirent_storage buf; int k; - k = readdir_r(d, &buffer, &de); + k = readdir_r(d, &buf.de, &de); if (k != 0) { r = -errno; break; @@ -375,7 +376,6 @@ static int find_symlinks_fd( int r = 0; DIR *d; - struct dirent buffer, *de; assert(name); assert(fd >= 0); @@ -391,8 +391,10 @@ static int find_symlinks_fd( for (;;) { int k; + struct dirent *de; + union dirent_storage buf; - k = readdir_r(d, &buffer, &de); + k = readdir_r(d, &buf.de, &de); if (k != 0) { r = -errno; break; @@ -1906,7 +1908,6 @@ int unit_file_get_list( return r; STRV_FOREACH(i, paths.unit_path) { - struct dirent buffer, *de; const char *units_dir; free(buf); @@ -1934,9 +1935,11 @@ int unit_file_get_list( } for (;;) { + struct dirent *de; + union dirent_storage buffer; UnitFileList *f; - r = readdir_r(d, &buffer, &de); + r = readdir_r(d, &buffer.de, &de); if (r != 0) { r = -r; goto finish; diff --git a/src/shared/util.c b/src/shared/util.c index 69c9437db..b48bad4c4 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -2956,9 +2956,10 @@ int dir_is_empty(const char *path) { return -errno; for (;;) { - struct dirent buf, *de; + struct dirent *de; + union dirent_storage buf; - r = readdir_r(d, &buf, &de); + r = readdir_r(d, &buf.de, &de); if (r > 0) return -r; @@ -3260,12 +3261,13 @@ int rm_rf_children_dangerous(int fd, bool only_dirs, bool honour_sticky, struct } for (;;) { - struct dirent buf, *de; + struct dirent *de; + union dirent_storage buf; bool is_dir, keep_around; struct stat st; int r; - r = readdir_r(d, &buf, &de); + r = readdir_r(d, &buf.de, &de); if (r != 0 && ret == 0) { ret = -r; break; @@ -4942,10 +4944,11 @@ int get_files_in_directory(const char *path, char ***list) { return -errno; for (;;) { - struct dirent buffer, *de; + struct dirent *de; + union dirent_storage buf; int k; - k = readdir_r(d, &buffer, &de); + k = readdir_r(d, &buf.de, &de); if (k != 0) { r = -k; goto finish; diff --git a/src/shared/util.h b/src/shared/util.h index 2429339f5..e5728bd87 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -35,6 +35,7 @@ #include #include #include +#include #include "macro.h" @@ -46,6 +47,12 @@ typedef struct dual_timestamp { usec_t monotonic; } dual_timestamp; +union dirent_storage { + struct dirent de; + uint8_t storage[offsetof(struct dirent, d_name) + + ((NAME_MAX + 1 + sizeof(long)) & ~(sizeof(long) - 1))]; +}; + #define MSEC_PER_SEC 1000ULL #define USEC_PER_SEC 1000000ULL #define USEC_PER_MSEC 1000ULL diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index 5d0f571be..f10f90845 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -551,12 +551,13 @@ static int recursive_relabel_children(Item *i, const char *path) { return errno == ENOENT ? 0 : -errno; for (;;) { - struct dirent buf, *de; + struct dirent *de; + union dirent_storage buf; bool is_dir; int r; char *entry_path; - r = readdir_r(d, &buf, &de); + r = readdir_r(d, &buf.de, &de); if (r != 0) { if (ret == 0) ret = -r; -- 2.30.2