1
0
mirror of https://github.com/systemd/systemd.git synced 2025-01-26 14:04:03 +03:00

Be more careful when checking for empty files

If we want to avoid reading a totally empty file, it seems better
to check after we have opened the file, not before.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2014-07-16 18:59:49 -04:00
parent 36f822c4bd
commit ed88bcfb7c
6 changed files with 36 additions and 20 deletions

View File

@ -495,11 +495,6 @@ static int netdev_load_one(Manager *manager, const char *filename) {
assert(manager);
assert(filename);
if (null_or_empty_path(filename)) {
log_debug("skipping empty file: %s", filename);
return 0;
}
file = fopen(filename, "re");
if (!file) {
if (errno == ENOENT)
@ -508,6 +503,11 @@ static int netdev_load_one(Manager *manager, const char *filename) {
return -errno;
}
if (null_or_empty_fd(fileno(file))) {
log_debug("Skipping empty file: %s", filename);
return 0;
}
netdev = new0(NetDev, 1);
if (!netdev)
return log_oom();

View File

@ -48,8 +48,8 @@ static int network_load_one(Manager *manager, const char *filename) {
return -errno;
}
if (null_or_empty_path(filename)) {
log_debug("skipping empty file: %s", filename);
if (null_or_empty_fd(fileno(file))) {
log_debug("Skipping empty file: %s", filename);
return 0;
}

View File

@ -3604,6 +3604,17 @@ int null_or_empty_path(const char *fn) {
return null_or_empty(&st);
}
int null_or_empty_fd(int fd) {
struct stat st;
assert(fd >= 0);
if (fstat(fd, &st) < 0)
return -errno;
return null_or_empty(&st);
}
DIR *xopendirat(int fd, const char *name, int flags) {
int nfd;
DIR *d;

View File

@ -499,6 +499,7 @@ noreturn void freeze(void);
bool null_or_empty(struct stat *st) _pure_;
int null_or_empty_path(const char *fn);
int null_or_empty_fd(int fd);
DIR *xopendirat(int dirfd, const char *name, int flags);

View File

@ -153,11 +153,6 @@ static int load_link(link_config_ctx *ctx, const char *filename) {
assert(ctx);
assert(filename);
if (null_or_empty_path(filename)) {
log_debug("skipping empty file: %s", filename);
return 0;
}
file = fopen(filename, "re");
if (!file) {
if (errno == ENOENT)
@ -166,6 +161,11 @@ static int load_link(link_config_ctx *ctx, const char *filename) {
return -errno;
}
if (null_or_empty_fd(fileno(file))) {
log_debug("Skipping empty file: %s", filename);
return 0;
}
link = new0(link_config, 1);
if (!link)
return log_oom();

View File

@ -1533,15 +1533,19 @@ static int parse_file(struct udev_rules *rules, const char *filename)
int line_nr = 0;
unsigned int i;
if (null_or_empty_path(filename)) {
log_debug("skip empty file: %s", filename);
return 0;
}
log_debug("read rules file: %s", filename);
f = fopen(filename, "re");
if (f == NULL)
return -1;
if (!f) {
if (errno == ENOENT)
return 0;
else
return -errno;
}
if (null_or_empty_fd(fileno(f))) {
log_debug("Skipping empty file: %s", filename);
return 0;
} else
log_debug("Reading rules file: %s", filename);
first_token = rules->token_cur;
filename_off = rules_add_string(rules, filename);