From c26b217d918a571104a072eec5068ac8ad94329e Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sat, 20 Dec 2014 08:50:52 -0500 Subject: 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 --- src/shared/util.c | 13 +++++++------ src/shared/util.h | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) (limited to 'src') 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); -- cgit v1.2.3-54-g00ecf