summaryrefslogtreecommitdiff
path: root/src/shared
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2014-12-20 08:50:52 -0500
committerAnthony G. Basile <blueness@gentoo.org>2014-12-20 08:50:52 -0500
commitc26b217d918a571104a072eec5068ac8ad94329e (patch)
treeb7b986fc90dc1d7b0e853a9e1c44d5b1f7f92a8e /src/shared
parent6b16cd5fedbcb4ca5162ee263ae9a16533390465 (diff)
util: when using basename() for creating temporary files, verify the resulting name is actually valid
Also, rename filename_is_safe() to filename_is_valid(), since it actually does a full validation for what the kernel will accept as file name, it's not just a heuristic. NOTE: eudev doesn't have filename_is_safe() -- AGB Signed-off-by: Anthony G. Basile <blueness@gentoo.org>
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/util.c13
-rw-r--r--src/shared/util.h2
2 files changed, 8 insertions, 7 deletions
diff --git a/src/shared/util.c b/src/shared/util.c
index 1b9edad70c..b53042182d 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -385,7 +385,7 @@ const char* split(const char **state, size_t *l, const char *separator, bool quo
*l = strcspn_escaped(current + 1, quotechars);
if (current[*l + 1] == '\0' ||
(current[*l + 2] && !strchr(separator, current[*l + 2]))) {
- /* right quote missing or garbage at the end*/
+ /* right quote missing or garbage at the end */
*state = current;
return NULL;
}
@@ -1044,15 +1044,15 @@ int fd_wait_for_event(int fd, int event, usec_t t) {
int fopen_temporary(const char *path, FILE **_f, char **_temp_path) {
FILE *f;
char *t;
- int fd;
+ int r, fd;
assert(path);
assert(_f);
assert(_temp_path);
- t = tempfn_xxxxxx(path);
- if (!t)
- return -ENOMEM;
+ r = tempfn_xxxxxx(path, &t);
+ if (r < 0)
+ return r;
#if HAVE_DECL_MKOSTEMP
fd = mkostemp_safe(t, O_WRONLY|O_CLOEXEC);
@@ -1577,7 +1577,8 @@ char *tempfn_xxxxxx(const char *p) {
strcpy(stpcpy(stpcpy(mempcpy(t, p, k), "."), fn), "XXXXXX");
- return t;
+ *ret = t;
+ return 0;
}
int is_dir(const char* path, bool follow) {
diff --git a/src/shared/util.h b/src/shared/util.h
index 21e977dc51..5cc8452407 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -453,7 +453,7 @@ union file_handle_union {
char padding[sizeof(struct file_handle) + MAX_HANDLE_SZ];
};
-char *tempfn_xxxxxx(const char *p);
+int tempfn_xxxxxx(const char *p, char **ret);
int is_dir(const char *path, bool follow);