chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
random-util: always cast from smaller to bigger type when comparing
[elogind.git]
/
src
/
basic
/
path-util.c
diff --git
a/src/basic/path-util.c
b/src/basic/path-util.c
index 84f327d7d050fbd4a6c1e98d21a6fb38316533a8..acd1007e3c08feb72b8767071574c7698d649d7b 100644
(file)
--- a/
src/basic/path-util.c
+++ b/
src/basic/path-util.c
@@
-444,11
+444,10
@@
bool path_equal(const char *a, const char *b) {
return path_compare(a, b) == 0;
}
return path_compare(a, b) == 0;
}
-bool path_equal_or_files_same(const char *a, const char *b) {
- return path_equal(a, b) || files_same(a, b) > 0;
+bool path_equal_or_files_same(const char *a, const char *b
, int flags
) {
+ return path_equal(a, b) || files_same(a, b
, flags
) > 0;
}
}
-#if 0 /// UNNEEDED by elogind
char* path_join(const char *root, const char *path, const char *rest) {
assert(path);
char* path_join(const char *root, const char *path, const char *rest) {
assert(path);
@@
-525,6
+524,7
@@
int find_binary(const char *name, char **ret) {
return last_error;
}
return last_error;
}
+#if 0 /// UNNEEDED by elogind
bool paths_check_timestamp(const char* const* paths, usec_t *timestamp, bool update) {
bool changed = false;
const char* const* i;
bool paths_check_timestamp(const char* const* paths, usec_t *timestamp, bool update) {
bool changed = false;
const char* const* i;
@@
-608,6
+608,7
@@
int mkfs_exists(const char *fstype) {
mkfs = strjoina("mkfs.", fstype);
return binary_is_good(mkfs);
}
mkfs = strjoina("mkfs.", fstype);
return binary_is_good(mkfs);
}
+#endif // 0
char *prefix_root(const char *root, const char *path) {
char *n, *p;
char *prefix_root(const char *root, const char *path) {
char *n, *p;
@@
-643,6
+644,7
@@
char *prefix_root(const char *root, const char *path) {
return n;
}
return n;
}
+#if 0 /// UNNEEDED by elogind
int parse_path_argument_and_warn(const char *path, bool suppress_root, char **arg) {
char *p;
int r;
int parse_path_argument_and_warn(const char *path, bool suppress_root, char **arg) {
char *p;
int r;
@@
-703,10
+705,7
@@
bool filename_is_valid(const char *p) {
if (isempty(p))
return false;
if (isempty(p))
return false;
- if (streq(p, "."))
- return false;
-
- if (streq(p, ".."))
+ if (dot_or_dot_dot(p))
return false;
e = strchrnul(p, '/');
return false;
e = strchrnul(p, '/');
@@
-724,14
+723,17
@@
bool path_is_safe(const char *p) {
if (isempty(p))
return false;
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 */
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 (st
req(p, ".") || st
artswith(p, "./") || endswith(p, "/.") || strstr(p, "/./"))
+ if (startswith(p, "./") || endswith(p, "/.") || strstr(p, "/./"))
return false;
if (strstr(p, "//"))
return false;
if (strstr(p, "//"))
@@
-898,3
+900,16
@@
int systemd_installation_has_version(const char *root, unsigned minimal_version)
return false;
}
#endif // 0
return false;
}
#endif // 0
+
+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;
+}