1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-10-30 06:25:25 +03:00

sysv-generator: always use fstatat() if we can

This commit is contained in:
Lennart Poettering 2015-01-14 22:37:56 +01:00
parent b3fae863ef
commit 805e5dda0a

View File

@ -722,28 +722,33 @@ static int enumerate_sysv(LookupPaths lp, Hashmap *all_services) {
}
while ((de = readdir(d))) {
SysvStub *service;
struct stat st;
_cleanup_free_ char *fpath = NULL, *name = NULL;
_cleanup_free_ SysvStub *service = NULL;
struct stat st;
int r;
if (hidden_file(de->d_name))
continue;
fpath = strjoin(*path, "/", de->d_name, NULL);
if (!fpath)
return log_oom();
if (stat(fpath, &st) < 0)
if (fstatat(dirfd(d), de->d_name, &st, 0) < 0) {
log_warning_errno(errno, "stat() failed on %s/%s: %m", *path, de->d_name);
continue;
}
if (!(st.st_mode & S_IXUSR))
continue;
if (!S_ISREG(st.st_mode))
continue;
name = sysv_translate_name(de->d_name);
if (!name)
return log_oom();
fpath = strjoin(*path, "/", de->d_name, NULL);
if (!fpath)
return log_oom();
if (hashmap_contains(all_services, name))
continue;
@ -756,12 +761,11 @@ static int enumerate_sysv(LookupPaths lp, Hashmap *all_services) {
service->path = fpath;
r = hashmap_put(all_services, service->name, service);
if (r < 0) {
free(service);
if (r < 0)
return log_oom();
}
name = fpath = NULL;
service = NULL;
}
}