From: Michael Tremer Date: Thu, 9 Mar 2023 13:43:51 +0000 (+0000) Subject: repo: Store the real path on stack to avoid it being altered later X-Git-Tag: 0.9.29~346 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b0bdddb318ca32200d6a481fbd080cfe21a73cf8;p=pakfire.git repo: Store the real path on stack to avoid it being altered later Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/include/pakfire/util.h b/src/libpakfire/include/pakfire/util.h index 89ffeb518..18b1e5b7d 100644 --- a/src/libpakfire/include/pakfire/util.h +++ b/src/libpakfire/include/pakfire/util.h @@ -68,6 +68,10 @@ int pakfire_path_is_absolute(const char* path); const char* pakfire_path_abspath(const char* path); const char* pakfire_path_relpath(const char* root, const char* path); +#define pakfire_path_realpath(dest, path) \ + __pakfire_path_realpath(dest, sizeof(dest), path) +int __pakfire_path_realpath(char* dest, const size_t length, const char* path); + // File stuff int pakfire_file_write(struct pakfire* pakfire, const char* path, diff --git a/src/libpakfire/repo.c b/src/libpakfire/repo.c index 950916073..bd467ccea 100644 --- a/src/libpakfire/repo.c +++ b/src/libpakfire/repo.c @@ -1504,7 +1504,7 @@ ERROR: PAKFIRE_EXPORT int pakfire_repo_compose(struct pakfire* pakfire, const char* path, int flags, const char** files) { struct pakfire_repo* repo = NULL; - const char* abspath = NULL; + char realpath[PATH_MAX]; char baseurl[PATH_MAX]; int r; @@ -1523,12 +1523,12 @@ PAKFIRE_EXPORT int pakfire_repo_compose(struct pakfire* pakfire, const char* pat } // Make path absolute - abspath = pakfire_path_abspath(path); - if (!abspath) - return 1; + r = pakfire_path_realpath(realpath, path); + if (r) + return r; // Prefix path with file:// to form baseurl - r = pakfire_string_format(baseurl, "file://%s", abspath); + r = pakfire_string_format(baseurl, "file://%s", realpath); if (r) return 1; @@ -1581,7 +1581,7 @@ PAKFIRE_EXPORT int pakfire_repo_compose(struct pakfire* pakfire, const char* pat const char* filename = pakfire_package_get_string(package, PAKFIRE_PKG_FILENAME); // Make new path - r = pakfire_path_join(destination_path, abspath, filename); + r = pakfire_path_join(destination_path, realpath, filename); if (r) goto OUT; diff --git a/src/libpakfire/util.c b/src/libpakfire/util.c index 8fe802f39..4711a1d8b 100644 --- a/src/libpakfire/util.c +++ b/src/libpakfire/util.c @@ -134,6 +134,17 @@ const char* pakfire_path_relpath(const char* root, const char* path) { return NULL; } +int __pakfire_path_realpath(char* dest, const size_t length, const char* path) { + char buffer[PATH_MAX]; + + // Resolve path to its absolute path and store it in buffer + char* p = realpath(path, buffer); + if (!p) + return 1; + + return __pakfire_string_set(dest, length, buffer); +} + int pakfire_path_exists(const char* path) { return !access(path, F_OK); }