From: Zbigniew Jędrzejewski-Szmek Date: Wed, 16 Jul 2014 22:59:49 +0000 (-0400) Subject: Be more careful when checking for empty files X-Git-Tag: v216~555 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=ed88bcfb7c15029f9fc95ee2380759a9eb782d46 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. --- diff --git a/src/network/networkd-netdev.c b/src/network/networkd-netdev.c index 9974913f4..8b96d60dc 100644 --- a/src/network/networkd-netdev.c +++ b/src/network/networkd-netdev.c @@ -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(); diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 700577fcc..3e46a1a80 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -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; } diff --git a/src/shared/util.c b/src/shared/util.c index 75dc58b63..4fda31c83 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -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; diff --git a/src/shared/util.h b/src/shared/util.h index b3187a9ea..d9d525e8a 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -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); diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index 73243fa10..512885f9c 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -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(); diff --git a/src/udev/udev-rules.c b/src/udev/udev-rules.c index 85f78bcde..9864016d1 100644 --- a/src/udev/udev-rules.c +++ b/src/udev/udev-rules.c @@ -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; + f = fopen(filename, "re"); + if (!f) { + if (errno == ENOENT) + return 0; + else + return -errno; } - log_debug("read rules file: %s", filename); - f = fopen(filename, "re"); - if (f == NULL) - return -1; + 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);