From: Lennart Poettering Date: Fri, 3 Mar 2023 17:15:39 +0000 (+0100) Subject: path-util: split filename_is_valid() in two X-Git-Tag: v254-rc1~159^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ec926463c0488a749d6f629fdd4bea9a319dfc5f;p=thirdparty%2Fsystemd.git 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. --- diff --git a/src/basic/path-util.c b/src/basic/path-util.c index e1cc26f618b..b9723962491 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 66879d1932a..af7f229908d 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) {