[pacman-dev] [PATCH 2/4] query_fileowner, mdirname: add error checks
Andrew Gregory
andrew.gregory.8 at gmail.com
Sat Aug 11 17:35:13 EDT 2012
Also consolidates cleanup for query_fileowner.
Signed-off-by: Andrew Gregory <andrew.gregory.8 at gmail.com>
---
src/pacman/query.c | 28 ++++++++++++++--------------
src/pacman/util.c | 5 ++++-
2 files changed, 18 insertions(+), 15 deletions(-)
diff --git a/src/pacman/query.c b/src/pacman/query.c
index b1e51a6..9afe680 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 2d1b762..ba7a8c0 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) {
--
1.7.11.4
More information about the pacman-dev
mailing list