diff options
author | Lennart Poettering <lennart@poettering.net> | 2014-12-20 08:50:52 -0500 |
---|---|---|
committer | Anthony G. Basile <blueness@gentoo.org> | 2014-12-20 08:50:52 -0500 |
commit | c26b217d918a571104a072eec5068ac8ad94329e (patch) | |
tree | b7b986fc90dc1d7b0e853a9e1c44d5b1f7f92a8e /src | |
parent | 6b16cd5fedbcb4ca5162ee263ae9a16533390465 (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')
-rw-r--r-- | src/shared/util.c | 13 | ||||
-rw-r--r-- | src/shared/util.h | 2 |
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); |