fs-util: unify code we use to check if dirent's d_name is "." or ".."
We use different idioms at different places. Let's replace this is the one true new idiom, that is even a bit faster...
This commit is contained in:
@@ -182,8 +182,7 @@ int cg_read_subgroup(DIR *d, char **fn) {
|
||||
if (de->d_type != DT_DIR)
|
||||
continue;
|
||||
|
||||
if (streq(de->d_name, ".") ||
|
||||
streq(de->d_name, ".."))
|
||||
if (dot_or_dot_dot(de->d_name))
|
||||
continue;
|
||||
|
||||
b = strdup(de->d_name);
|
||||
|
||||
+1
-1
@@ -331,7 +331,7 @@ static int fd_copy_directory(
|
||||
struct stat buf;
|
||||
int q;
|
||||
|
||||
if (STR_IN_SET(de->d_name, ".", ".."))
|
||||
if (dot_or_dot_dot(de->d_name))
|
||||
continue;
|
||||
|
||||
if (fstatat(dirfd(d), de->d_name, &buf, AT_SYMLINK_NOFOLLOW) < 0) {
|
||||
|
||||
+19
-6
@@ -699,10 +699,7 @@ bool filename_is_valid(const char *p) {
|
||||
if (isempty(p))
|
||||
return false;
|
||||
|
||||
if (streq(p, "."))
|
||||
return false;
|
||||
|
||||
if (streq(p, ".."))
|
||||
if (dot_or_dot_dot(p))
|
||||
return false;
|
||||
|
||||
e = strchrnul(p, '/');
|
||||
@@ -720,14 +717,17 @@ bool path_is_safe(const char *p) {
|
||||
if (isempty(p))
|
||||
return false;
|
||||
|
||||
if (streq(p, "..") || startswith(p, "../") || endswith(p, "/..") || strstr(p, "/../"))
|
||||
if (dot_or_dot_dot(p))
|
||||
return false;
|
||||
|
||||
if (startswith(p, "../") || endswith(p, "/..") || strstr(p, "/../"))
|
||||
return false;
|
||||
|
||||
if (strlen(p)+1 > PATH_MAX)
|
||||
return false;
|
||||
|
||||
/* The following two checks are not really dangerous, but hey, they still are confusing */
|
||||
if (streq(p, ".") || startswith(p, "./") || endswith(p, "/.") || strstr(p, "/./"))
|
||||
if (startswith(p, "./") || endswith(p, "/.") || strstr(p, "/./"))
|
||||
return false;
|
||||
|
||||
if (strstr(p, "//"))
|
||||
@@ -892,3 +892,16 @@ int systemd_installation_has_version(const char *root, unsigned minimal_version)
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool dot_or_dot_dot(const char *path) {
|
||||
if (!path)
|
||||
return false;
|
||||
if (path[0] != '.')
|
||||
return false;
|
||||
if (path[1] == 0)
|
||||
return true;
|
||||
if (path[1] != '.')
|
||||
return false;
|
||||
|
||||
return path[2] == 0;
|
||||
}
|
||||
|
||||
@@ -141,3 +141,5 @@ bool is_device_path(const char *path);
|
||||
bool is_deviceallow_pattern(const char *path);
|
||||
|
||||
int systemd_installation_has_version(const char *root, unsigned minimal_version);
|
||||
|
||||
bool dot_or_dot_dot(const char *path);
|
||||
|
||||
+1
-1
@@ -83,7 +83,7 @@ int rm_rf_children(int fd, RemoveFlags flags, struct stat *root_dev) {
|
||||
bool is_dir;
|
||||
struct stat st;
|
||||
|
||||
if (streq(de->d_name, ".") || streq(de->d_name, ".."))
|
||||
if (dot_or_dot_dot(de->d_name))
|
||||
continue;
|
||||
|
||||
if (de->d_type == DT_UNKNOWN ||
|
||||
|
||||
@@ -877,7 +877,7 @@ bool ifname_valid(const char *p) {
|
||||
if (strlen(p) >= IFNAMSIZ)
|
||||
return false;
|
||||
|
||||
if (STR_IN_SET(p, ".", ".."))
|
||||
if (dot_or_dot_dot(p))
|
||||
return false;
|
||||
|
||||
while (*p) {
|
||||
|
||||
Reference in New Issue
Block a user