From: Lennart Poettering Date: Tue, 12 May 2020 21:36:27 +0000 (+0200) Subject: journalctl,elsewhere: make sure --file=foo fails with sane error msg if foo is not... X-Git-Tag: v246-rc1~335 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=544e146b0e2f6227e28476e36becd1019b14ef70;p=thirdparty%2Fsystemd.git journalctl,elsewhere: make sure --file=foo fails with sane error msg if foo is not readable It annoyed me for quite a while that running "journalctl --file=…" on a file that is not readable failed with a "File not found" error instead of a permission error. Let's fix that. We make this work by using the GLOB_NOCHECK flag for glob() which means that files are not accessible will be returned in the array as they are instead of being filtered away. This then means that our later attemps to open the files will fail cleanly with a good error message. --- diff --git a/src/basic/glob-util.c b/src/basic/glob-util.c index e3aa6c2e152..1e7e301e098 100644 --- a/src/basic/glob-util.c +++ b/src/basic/glob-util.c @@ -61,11 +61,11 @@ int glob_exists(const char *path) { return true; } -int glob_extend(char ***strv, const char *path) { +int glob_extend(char ***strv, const char *path, int flags) { _cleanup_globfree_ glob_t g = {}; int k; - k = safe_glob(path, GLOB_NOSORT|GLOB_BRACE, &g); + k = safe_glob(path, GLOB_NOSORT|GLOB_BRACE|flags, &g); if (k < 0) return k; diff --git a/src/basic/glob-util.h b/src/basic/glob-util.h index 8b1bb02be13..3d5f5435085 100644 --- a/src/basic/glob-util.h +++ b/src/basic/glob-util.h @@ -11,7 +11,7 @@ int safe_glob(const char *path, int flags, glob_t *pglob); int glob_exists(const char *path); -int glob_extend(char ***strv, const char *path); +int glob_extend(char ***strv, const char *path, int flags); #define _cleanup_globfree_ _cleanup_(globfree) diff --git a/src/basic/path-util.c b/src/basic/path-util.c index ba13de01ff0..986dfe94a4b 100644 --- a/src/basic/path-util.c +++ b/src/basic/path-util.c @@ -1051,7 +1051,7 @@ int systemd_installation_has_version(const char *root, unsigned minimal_version) if (!path) return -ENOMEM; - r = glob_extend(&names, path); + r = glob_extend(&names, path, 0); if (r == -ENOENT) continue; if (r < 0) diff --git a/src/coredump/coredumpctl.c b/src/coredump/coredumpctl.c index 60a02b770be..ed4d06e9866 100644 --- a/src/coredump/coredumpctl.c +++ b/src/coredump/coredumpctl.c @@ -237,7 +237,7 @@ static int parse_argv(int argc, char *argv[]) { break; case ARG_FILE: - r = glob_extend(&arg_file, optarg); + r = glob_extend(&arg_file, optarg, GLOB_NOCHECK); if (r < 0) return log_error_errno(r, "Failed to add paths: %m"); break; diff --git a/src/journal-remote/journal-upload.c b/src/journal-remote/journal-upload.c index 2f9585df564..bf656ac6706 100644 --- a/src/journal-remote/journal-upload.c +++ b/src/journal-remote/journal-upload.c @@ -720,7 +720,7 @@ static int parse_argv(int argc, char *argv[]) { break; case ARG_FILE: - r = glob_extend(&arg_file, optarg); + r = glob_extend(&arg_file, optarg, GLOB_NOCHECK); if (r < 0) return log_error_errno(r, "Failed to add paths: %m"); break; diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index 01d75b0e24d..a082995498f 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -705,7 +705,7 @@ static int parse_argv(int argc, char *argv[]) { * STDIN. To avoid confusion we hence don't document this feature. */ arg_file_stdin = true; else { - r = glob_extend(&arg_file, optarg); + r = glob_extend(&arg_file, optarg, GLOB_NOCHECK); if (r < 0) return log_error_errno(r, "Failed to add paths: %m"); } diff --git a/src/sysctl/sysctl.c b/src/sysctl/sysctl.c index 3b3305d7f68..5274cd24b38 100644 --- a/src/sysctl/sysctl.c +++ b/src/sysctl/sysctl.c @@ -138,7 +138,7 @@ static int apply_all(OrderedHashmap *sysctl_options) { if (!pattern) return log_oom(); - k = glob_extend(&paths, pattern); + k = glob_extend(&paths, pattern, GLOB_NOCHECK); if (k < 0) { if (option->ignore_failure || ERRNO_IS_PRIVILEGE(k)) log_debug_errno(k, "Failed to resolve glob '%s', ignoring: %m",