From ea35ce5d2e067b6bfa6d4f443c5f8591a1bc9958 Mon Sep 17 00:00:00 2001 From: Andrew Gregory Date: Sat, 11 Aug 2012 17:35:13 -0400 Subject: query_fileowner, mdirname: add error checks Also consolidates cleanup for query_fileowner. Signed-off-by: Andrew Gregory --- src/pacman/query.c | 28 ++++++++++++++-------------- src/pacman/util.c | 5 ++++- 2 files changed, 18 insertions(+), 15 deletions(-) (limited to 'src/pacman') 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) { -- cgit v1.2.3-70-g09d2