summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Gregory <andrew.gregory.8@gmail.com>2012-08-11 23:35:13 +0200
committerDan McGee <dan@archlinux.org>2012-09-18 15:28:34 +0200
commitea35ce5d2e067b6bfa6d4f443c5f8591a1bc9958 (patch)
tree52f1465ee30565baaef889c82b7ea5f279c59822
parentde7a5cf346c3ea8c26e43f4f17834af6fc38a13b (diff)
downloadpacman-ea35ce5d2e067b6bfa6d4f443c5f8591a1bc9958.tar.gz
pacman-ea35ce5d2e067b6bfa6d4f443c5f8591a1bc9958.tar.xz
query_fileowner, mdirname: add error checks
Also consolidates cleanup for query_fileowner. Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com>
-rw-r--r--src/pacman/query.c28
-rw-r--r--src/pacman/util.c5
2 files changed, 18 insertions, 15 deletions
diff --git a/src/pacman/query.c b/src/pacman/query.c
index ed8bc1b5..fc2c90c4 100644
--- a/src/pacman/query.c
+++ b/src/pacman/query.c
@@ -129,14 +129,16 @@ static int query_fileowner(alpm_list_t *targets)
db_local = alpm_get_localdb(config->handle);
for(t = targets; t; t = alpm_list_next(t)) {
- char *filename, *dname, *rpath;
+ char *filename = NULL, *dname = NULL, *rpath = NULL;
const char *bname;
struct stat buf;
alpm_list_t *i;
size_t len;
int found = 0;
- filename = strdup(t->data);
+ if((filename = strdup(t->data)) == NULL) {
+ goto targcleanup;
+ }
/* trailing '/' causes lstat to dereference directory symlinks */
len = strlen(filename) - 1;
@@ -150,25 +152,19 @@ static int query_fileowner(alpm_list_t *targets)
if(search_path(&filename, &buf) == -1) {
pm_printf(ALPM_LOG_ERROR, _("failed to find '%s' in PATH: %s\n"),
filename, strerror(errno));
- ret++;
- free(filename);
- continue;
+ goto targcleanup;
}
} else {
pm_printf(ALPM_LOG_ERROR, _("failed to read file '%s': %s\n"),
filename, strerror(errno));
- ret++;
- free(filename);
- continue;
+ goto targcleanup;
}
}
if(S_ISDIR(buf.st_mode)) {
pm_printf(ALPM_LOG_ERROR,
_("cannot determine ownership of directory '%s'\n"), filename);
- ret++;
- free(filename);
- continue;
+ goto targcleanup;
}
bname = mbasename(filename);
@@ -180,7 +176,6 @@ static int query_fileowner(alpm_list_t *targets)
filename, strerror(errno));
goto targcleanup;
}
- free(dname);
for(i = alpm_db_get_pkgcache(db_local); i && !found; i = alpm_list_next(i)) {
alpm_pkg_t *info = i->data;
@@ -199,6 +194,7 @@ static int query_fileowner(alpm_list_t *targets)
/* concatenate our file and the root path */
if(rootlen + 1 + strlen(pkgfile) > PATH_MAX) {
+ path[rootlen] = '\0'; /* reset path for error message */
pm_printf(ALPM_LOG_ERROR, _("path too long: %s%s\n"), path, pkgfile);
continue;
}
@@ -207,11 +203,10 @@ static int query_fileowner(alpm_list_t *targets)
pdname = mdirname(path);
ppath = realpath(pdname, NULL);
free(pdname);
- path[rootlen] = '\0'; /* reset path for error messages */
if(!ppath) {
pm_printf(ALPM_LOG_ERROR, _("cannot determine real path for '%s': %s\n"),
- pdname, strerror(errno));
+ path, strerror(errno));
continue;
}
@@ -226,10 +221,15 @@ static int query_fileowner(alpm_list_t *targets)
}
if(!found) {
pm_printf(ALPM_LOG_ERROR, _("No package owns %s\n"), filename);
+ }
+
+targcleanup:
+ if(!found) {
ret++;
}
free(filename);
free(rpath);
+ free(dname);
}
return ret;
diff --git a/src/pacman/util.c b/src/pacman/util.c
index 2d1b7626..5079b4ce 100644
--- a/src/pacman/util.c
+++ b/src/pacman/util.c
@@ -239,7 +239,10 @@ char *mdirname(const char *path)
return strdup(".");
}
- ret = strdup(path);
+ if((ret = strdup(path)) == NULL) {
+ return NULL;
+ }
+
last = strrchr(ret, '/');
if(last != NULL) {