diff options
Diffstat (limited to 'testing/kmod/0008-Use-realpath-to-canonicalize-provided-paths.patch')
-rw-r--r-- | testing/kmod/0008-Use-realpath-to-canonicalize-provided-paths.patch | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/testing/kmod/0008-Use-realpath-to-canonicalize-provided-paths.patch b/testing/kmod/0008-Use-realpath-to-canonicalize-provided-paths.patch new file mode 100644 index 000000000..652d2e854 --- /dev/null +++ b/testing/kmod/0008-Use-realpath-to-canonicalize-provided-paths.patch @@ -0,0 +1,163 @@ +From 4148d50c980e20a71b5e284e93863b4f36f4fbe4 Mon Sep 17 00:00:00 2001 +From: Dan McGee <dan@archlinux.org> +Date: Fri, 3 Feb 2012 15:01:34 -0600 +Subject: [PATCH 8/8] Use realpath() to canonicalize provided paths + +The existing function choked in several corner cases: +* '/tmp/../tmp' was seen as absolute, so not cleaned up. +* '/tmp/' and '/tmp' were not equal, causing depmod to act differently + when called with the -b option for the two paths. + +Don't reinvent the wheel; just use the standard library function. + +Signed-off-by: Dan McGee <dan@archlinux.org> +--- + libkmod/libkmod-module.c | 6 +++--- + libkmod/libkmod-util.c | 36 ------------------------------------ + libkmod/libkmod-util.h | 2 -- + libkmod/libkmod.c | 13 +++++++++---- + tools/kmod-depmod.c | 8 ++++++-- + 5 files changed, 18 insertions(+), 47 deletions(-) + +diff --git a/libkmod/libkmod-module.c b/libkmod/libkmod-module.c +index 48e4aa1..48e7286 100644 +--- a/libkmod/libkmod-module.c ++++ b/libkmod/libkmod-module.c +@@ -326,10 +326,10 @@ KMOD_EXPORT int kmod_module_new_from_path(struct kmod_ctx *ctx, + if (ctx == NULL || path == NULL || mod == NULL) + return -ENOENT; + +- abspath = path_make_absolute_cwd(path); ++ abspath = canonicalize_file_name(path); + if (abspath == NULL) { +- DBG(ctx, "no absolute path for %s\n", path); +- return -ENOMEM; ++ DBG(ctx, "no canonical filename returned for %s\n", path); ++ return -errno; + } + + err = stat(abspath, &st); +diff --git a/libkmod/libkmod-util.c b/libkmod/libkmod-util.c +index 6a9f697..02b7f63 100644 +--- a/libkmod/libkmod-util.c ++++ b/libkmod/libkmod-util.c +@@ -301,42 +301,6 @@ char *strchr_replace(char *s, int c, char r) + return s; + } + +-bool path_is_absolute(const char *p) +-{ +- assert(p != NULL); +- +- return p[0] == '/'; +-} +- +-char *path_make_absolute_cwd(const char *p) +-{ +- char *cwd, *r; +- size_t plen; +- size_t cwdlen; +- +- if (path_is_absolute(p)) +- return strdup(p); +- +- cwd = get_current_dir_name(); +- if (cwd == NULL) +- return NULL; +- +- plen = strlen(p); +- cwdlen = strlen(cwd); +- +- /* cwd + '/' + p + '\0' */ +- r = realloc(cwd, cwdlen + 1 + plen + 1); +- if (r == NULL) { +- free(cwd); +- return NULL; +- } +- +- r[cwdlen] = '/'; +- memcpy(&r[cwdlen + 1], p, plen + 1); +- +- return r; +-} +- + #define USEC_PER_SEC 1000000ULL + #define NSEC_PER_USEC 1000ULL + unsigned long long ts_usec(const struct timespec *ts) +diff --git a/libkmod/libkmod-util.h b/libkmod/libkmod-util.h +index c9a1a21..63c348f 100644 +--- a/libkmod/libkmod-util.h ++++ b/libkmod/libkmod-util.h +@@ -19,8 +19,6 @@ ssize_t write_str_safe(int fd, const char *buf, size_t buflen) __attribute__((no + int read_str_long(int fd, long *value, int base) __must_check __attribute__((nonnull(2))); + int read_str_ulong(int fd, unsigned long *value, int base) __must_check __attribute__((nonnull(2))); + char *strchr_replace(char *s, int c, char r); +-bool path_is_absolute(const char *p) __must_check __attribute__((nonnull(1))); +-char *path_make_absolute_cwd(const char *p) __must_check __attribute__((nonnull(1))); + int alias_normalize(const char *alias, char buf[PATH_MAX], size_t *len) __must_check __attribute__((nonnull(1,2))); + char *modname_normalize(const char *modname, char buf[PATH_MAX], size_t *len) __attribute__((nonnull(1, 2))); + char *path_to_modname(const char *path, char buf[PATH_MAX], size_t *len) __attribute__((nonnull(2))); +diff --git a/libkmod/libkmod.c b/libkmod/libkmod.c +index 800a178..c578afb 100644 +--- a/libkmod/libkmod.c ++++ b/libkmod/libkmod.c +@@ -160,13 +160,18 @@ static int log_priority(const char *priority) + + static const char *dirname_default_prefix = ROOTPREFIX "/lib/modules"; + +-static char *get_kernel_release(const char *dirname) ++static char *get_kernel_release(struct kmod_ctx *ctx, const char *dirname) + { + struct utsname u; + char *p; + +- if (dirname != NULL) +- return path_make_absolute_cwd(dirname); ++ if (dirname != NULL) { ++ p = canonicalize_file_name(dirname); ++ if (p) ++ return p; ++ INFO(ctx, "could not canonicalize directory %s: %m\n", dirname); ++ return strdup(dirname); ++ } + + if (uname(&u) < 0) + return NULL; +@@ -215,7 +220,7 @@ KMOD_EXPORT struct kmod_ctx *kmod_new(const char *dirname, + ctx->log_data = stderr; + ctx->log_priority = LOG_ERR; + +- ctx->dirname = get_kernel_release(dirname); ++ ctx->dirname = get_kernel_release(ctx, dirname); + + /* environment overwrites config */ + env = getenv("KMOD_LOG"); +diff --git a/tools/kmod-depmod.c b/tools/kmod-depmod.c +index 0cf28f6..72180ef 100644 +--- a/tools/kmod-depmod.c ++++ b/tools/kmod-depmod.c +@@ -1160,7 +1160,7 @@ static int depmod_module_add(struct depmod *depmod, struct kmod_module *kmod) + } + } + +- DBG("add %p kmod=%p, path=%s\n", mod, kmod, mod->path); ++ DBG("add %p kmod=%p, path=%s, relpath=%s\n", mod, kmod, mod->path, mod->relpath); + + return 0; + } +@@ -2547,7 +2547,11 @@ static int do_depmod(int argc, char *argv[]) + maybe_all = 1; + break; + case 'b': +- root = path_make_absolute_cwd(optarg); ++ root = canonicalize_file_name(optarg); ++ if (!root) { ++ CRIT("could not resolve path %s\n", optarg); ++ goto cmdline_failed; ++ } + break; + case 'C': { + size_t bytes = sizeof(char *) * (n_config_paths + 2); +-- +1.7.9 + |