From 39d064aff83976abdbe1de661f27fa56cd0776b6 Mon Sep 17 00:00:00 2001 From: Juan RP Date: Sat, 24 Dec 2011 12:07:30 +0100 Subject: [PATCH] xbps_unpack_binary_pkg: handle EPERM more efficiently. --- lib/package_unpack.c | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/lib/package_unpack.c b/lib/package_unpack.c index 0ceadf2f..437df954 100644 --- a/lib/package_unpack.c +++ b/lib/package_unpack.c @@ -31,6 +31,7 @@ #include #include #include +#include #include "xbps_api_impl.h" @@ -88,23 +89,44 @@ extract_metafile(struct archive *ar, int flags) { const char *version; - char *buf, *pkgname; + char *buf, *dirc, *dname, *pkgname; int rv; pkgname = xbps_pkg_name(pkgver); if (pkgname == NULL) return ENOMEM; version = xbps_pkg_version(pkgver); - + if (version == NULL) { + free(pkgname); + return ENOMEM; + } buf = xbps_xasprintf("%s/metadata/%s/%s", XBPS_META_PATH, pkgname, file); if (buf == NULL) { free(pkgname); return ENOMEM; } - archive_entry_set_pathname(entry, buf); + dirc = strdup(buf); + if (dirc == NULL) { + free(buf); + free(pkgname); + return ENOMEM; + } free(buf); + dname = dirname(dirc); + if (access(dname, X_OK) == -1) { + if (xbps_mkpath(dname, 0755) == -1) { + xbps_set_cb_state(XBPS_STATE_UNPACK_FAIL, + errno, pkgname, version, + "%s: [unpack] failed to create metadir `%s': %s", + pkgver, dname, strerror(errno)); + free(dirc); + free(pkgname); + return errno; + + } + } if (exec) archive_entry_set_perm(entry, 0750); @@ -132,7 +154,10 @@ remove_metafile(const char *file, const char *pkgver) if (pkgname == NULL) return ENOMEM; version = xbps_pkg_version(pkgver); - + if (version == NULL) { + free(pkgname); + return ENOMEM; + } buf = xbps_xasprintf("%s/metadata/%s/%s", XBPS_META_PATH, pkgname, file); if (buf == NULL) { @@ -261,14 +286,14 @@ unpack_archive(prop_dictionary_t pkg_repod, struct archive *ar) } rv = extract_metafile(ar, entry, "INSTALL", pkgver, true, flags); - if (rv != 0) { - free(buf); + if (rv != 0) goto out; - } + rv = xbps_file_exec(buf, "pre", pkgname, version, update ? "yes" : "no", xhp->conffile, NULL); free(buf); + buf = NULL; if (rv != 0) { xbps_set_cb_state(XBPS_STATE_UNPACK_FAIL, rv, pkgname, version, @@ -423,6 +448,7 @@ unpack_archive(prop_dictionary_t pkg_repod, struct archive *ar) } (void)rename(entry_pname, buf); free(buf); + buf = NULL; xbps_set_cb_state(XBPS_STATE_CONFIG_FILE, 0, pkgname, version, "Renamed old configuration file " @@ -615,7 +641,7 @@ xbps_unpack_binary_pkg(prop_dictionary_t pkg_repod) if (rv != 0) { xbps_set_cb_state(XBPS_STATE_UNPACK_FAIL, rv, pkgname, version, - "%s: [unpack] failed to unpack files on archive: %s", + "%s: [unpack] failed to unpack files from archive: %s", pkgver, strerror(rv)); goto out; }