execute: filter out "." for ".." in EnvironmentFile= globs too

This doesn't really matter much, only in case somebody would use
something strange like

  EnvironmentFile=/etc/something/.*

Make sure that "." and ".." is not returned by that glob. This makes
all our globbing patterns behave the same.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2017-04-25 22:54:50 -04:00
parent 84e72b5ef4
commit d8c92e8bc7

View file

@ -3231,11 +3231,10 @@ int exec_context_load_environment(Unit *unit, const ExecContext *c, char ***l) {
STRV_FOREACH(i, c->environment_files) { STRV_FOREACH(i, c->environment_files) {
char *fn; char *fn;
int k; int k, n;
bool ignore = false; bool ignore = false;
char **p; char **p;
_cleanup_globfree_ glob_t pglob = {}; _cleanup_globfree_ glob_t pglob = {};
int count, n;
fn = *i; fn = *i;
@ -3253,23 +3252,19 @@ int exec_context_load_environment(Unit *unit, const ExecContext *c, char ***l) {
} }
/* Filename supports globbing, take all matching files */ /* Filename supports globbing, take all matching files */
errno = 0; k = safe_glob(fn, 0, &pglob);
if (glob(fn, 0, NULL, &pglob) != 0) { if (k < 0) {
if (ignore) if (ignore)
continue; continue;
strv_free(r); strv_free(r);
return errno > 0 ? -errno : -EINVAL; return k;
} }
count = pglob.gl_pathc;
if (count == 0) {
if (ignore)
continue;
strv_free(r); /* When we don't match anything, -ENOENT should be returned */
return -EINVAL; assert(pglob.gl_pathc > 0);
}
for (n = 0; n < count; n++) { for (n = 0; n < pglob.gl_pathc; n++) {
k = load_env_file(NULL, pglob.gl_pathv[n], NULL, &p); k = load_env_file(NULL, pglob.gl_pathv[n], NULL, &p);
if (k < 0) { if (k < 0) {
if (ignore) if (ignore)