[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