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
This commit is contained in:
parent
57f3067825
commit
7d5e9c0f60
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include <sys/stat.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/resource.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue