|
|
9767024 |
From 46c3a085f0aa48e832be8ac78d77544e1dc0ca6b Mon Sep 17 00:00:00 2001
|
|
|
9ecd5b8 |
From: Lennart Poettering <lennart@poettering.net>
|
|
|
9ecd5b8 |
Date: Wed, 14 Jan 2015 22:37:56 +0100
|
|
|
9ecd5b8 |
Subject: [PATCH] sysv-generator: always use fstatat() if we can
|
|
|
9ecd5b8 |
|
|
|
9ecd5b8 |
(cherry picked from commit 805e5dda0a01c99d231824e1a9c4a208418bf342)
|
|
|
9ecd5b8 |
---
|
|
|
9ecd5b8 |
src/sysv-generator/sysv-generator.c | 25 +++++++++++++++----------
|
|
|
9ecd5b8 |
1 file changed, 15 insertions(+), 10 deletions(-)
|
|
|
9ecd5b8 |
|
|
|
9ecd5b8 |
diff --git a/src/sysv-generator/sysv-generator.c b/src/sysv-generator/sysv-generator.c
|
|
|
9ecd5b8 |
index 6f87f63b72..bf49b24195 100644
|
|
|
9ecd5b8 |
--- a/src/sysv-generator/sysv-generator.c
|
|
|
9ecd5b8 |
+++ b/src/sysv-generator/sysv-generator.c
|
|
|
9ecd5b8 |
@@ -727,28 +727,34 @@ static int enumerate_sysv(LookupPaths lp, Hashmap *all_services) {
|
|
|
9ecd5b8 |
}
|
|
|
9ecd5b8 |
|
|
|
9ecd5b8 |
while ((de = readdir(d))) {
|
|
|
9ecd5b8 |
- SysvStub *service;
|
|
|
9ecd5b8 |
- struct stat st;
|
|
|
9ecd5b8 |
_cleanup_free_ char *fpath = NULL, *name = NULL;
|
|
|
9ecd5b8 |
+ _cleanup_free_ SysvStub *service = NULL;
|
|
|
9ecd5b8 |
+ struct stat st;
|
|
|
9ecd5b8 |
int r;
|
|
|
9ecd5b8 |
|
|
|
9ecd5b8 |
if (ignore_file(de->d_name))
|
|
|
9ecd5b8 |
continue;
|
|
|
9ecd5b8 |
|
|
|
9ecd5b8 |
- fpath = strjoin(*path, "/", de->d_name, NULL);
|
|
|
9ecd5b8 |
- if (!fpath)
|
|
|
9ecd5b8 |
- return log_oom();
|
|
|
9ecd5b8 |
-
|
|
|
9ecd5b8 |
- if (stat(fpath, &st) < 0)
|
|
|
9ecd5b8 |
+ if (fstatat(dirfd(d), de->d_name, &st, 0) < 0) {
|
|
|
9ecd5b8 |
+ log_warning("stat() failed on %s/%s: %s",
|
|
|
9ecd5b8 |
+ *path, de->d_name, strerror(-r));
|
|
|
9ecd5b8 |
continue;
|
|
|
9ecd5b8 |
+ }
|
|
|
9ecd5b8 |
|
|
|
9ecd5b8 |
if (!(st.st_mode & S_IXUSR))
|
|
|
9ecd5b8 |
continue;
|
|
|
9ecd5b8 |
|
|
|
9ecd5b8 |
+ if (!S_ISREG(st.st_mode))
|
|
|
9ecd5b8 |
+ continue;
|
|
|
9ecd5b8 |
+
|
|
|
9ecd5b8 |
name = sysv_translate_name(de->d_name);
|
|
|
9ecd5b8 |
if (!name)
|
|
|
9ecd5b8 |
return log_oom();
|
|
|
9ecd5b8 |
|
|
|
9ecd5b8 |
+ fpath = strjoin(*path, "/", de->d_name, NULL);
|
|
|
9ecd5b8 |
+ if (!fpath)
|
|
|
9ecd5b8 |
+ return log_oom();
|
|
|
9ecd5b8 |
+
|
|
|
9ecd5b8 |
if (hashmap_contains(all_services, name))
|
|
|
9ecd5b8 |
continue;
|
|
|
9ecd5b8 |
|
|
|
9ecd5b8 |
@@ -761,12 +767,11 @@ static int enumerate_sysv(LookupPaths lp, Hashmap *all_services) {
|
|
|
9ecd5b8 |
service->path = fpath;
|
|
|
9ecd5b8 |
|
|
|
9ecd5b8 |
r = hashmap_put(all_services, service->name, service);
|
|
|
9ecd5b8 |
- if (r < 0) {
|
|
|
9ecd5b8 |
- free(service);
|
|
|
9ecd5b8 |
+ if (r < 0)
|
|
|
9ecd5b8 |
return log_oom();
|
|
|
9ecd5b8 |
- }
|
|
|
9ecd5b8 |
|
|
|
9ecd5b8 |
name = fpath = NULL;
|
|
|
9ecd5b8 |
+ service = NULL;
|
|
|
9ecd5b8 |
}
|
|
|
9ecd5b8 |
}
|
|
|
9ecd5b8 |
|