From ec926463c0488a749d6f629fdd4bea9a319dfc5f Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 3 Mar 2023 18:15:39 +0100 Subject: [PATCH] path-util: split filename_is_valid() in two Add a helper filename_part_is_valid() which does half of what filename_is_valid() does: it checks for valid chars and length, but does not filter out ".", ".." and "", as these are OK as parts of filenames, just not alone. --- src/basic/path-util.c | 19 +++++++++++++++---- src/basic/path-util.h | 1 + 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/basic/path-util.c b/src/basic/path-util.c index e1cc26f618..b972396249 100644 --- a/src/basic/path-util.c +++ b/src/basic/path-util.c @@ -1124,13 +1124,13 @@ int path_extract_directory(const char *path, char **ret) { return 0; } -bool filename_is_valid(const char *p) { +bool filename_part_is_valid(const char *p) { const char *e; - if (isempty(p)) - return false; + /* Checks f the specified string is OK to be *part* of a filename. This is different from + * filename_is_valid() as "." and ".." and "" are OK by this call, but not by filename_is_valid(). */ - if (dot_or_dot_dot(p)) /* Yes, in this context we consider "." and ".." invalid */ + if (!p) return false; e = strchrnul(p, '/'); @@ -1143,6 +1143,17 @@ bool filename_is_valid(const char *p) { return true; } +bool filename_is_valid(const char *p) { + + if (isempty(p)) + return false; + + if (dot_or_dot_dot(p)) /* Yes, in this context we consider "." and ".." invalid */ + return false; + + return filename_part_is_valid(p); +} + bool path_is_valid_full(const char *p, bool accept_dot_dot) { if (isempty(p)) return false; diff --git a/src/basic/path-util.h b/src/basic/path-util.h index 66879d1932..af7f229908 100644 --- a/src/basic/path-util.h +++ b/src/basic/path-util.h @@ -163,6 +163,7 @@ const char *last_path_component(const char *path); int path_extract_filename(const char *path, char **ret); int path_extract_directory(const char *path, char **ret); +bool filename_part_is_valid(const char *p) _pure_; bool filename_is_valid(const char *p) _pure_; bool path_is_valid_full(const char *p, bool accept_dot_dot) _pure_; static inline bool path_is_valid(const char *p) {