[pacman-dev] [PATCH] Check return value of chdir and getwd

Allan McRae allan at archlinux.org
Sun Jun 27 06:40:36 EDT 2010


Prevents compiler warnings when building with -D_FORTIFY_SOURCE=2

Signed-off-by: Allan McRae <allan at archlinux.org>
---

In commit_single_pkg in lib/libalpm/add.c the failure of changing directory has now become
an error.  From the comment above it, it looks like it should be an error if it fails, but
I have been wrong before...

 lib/libalpm/add.c   |   18 +++++++++++++-----
 lib/libalpm/util.c  |    8 ++++++--
 src/pacman/pacman.c |   17 +++++++++++++++--
 3 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c
index f39a0ec..e45073e 100644
--- a/lib/libalpm/add.c
+++ b/lib/libalpm/add.c
@@ -556,6 +556,7 @@ static int commit_single_pkg(pmpkg_t *newpkg, int pkg_current, int pkg_count,
 		struct archive *archive;
 		struct archive_entry *entry;
 		char cwd[PATH_MAX] = "";
+		int restore_cwd = 0;
 
 		_alpm_log(PM_LOG_DEBUG, "extracting files\n");
 
@@ -579,11 +580,16 @@ static int commit_single_pkg(pmpkg_t *newpkg, int pkg_current, int pkg_count,
 		/* save the cwd so we can restore it later */
 		if(getcwd(cwd, PATH_MAX) == NULL) {
 			_alpm_log(PM_LOG_ERROR, _("could not get current working directory\n"));
-			cwd[0] = 0;
+		} else {
+			restore_cwd = 1;
 		}
 
 		/* libarchive requires this for extracting hard links */
-		chdir(handle->root);
+		if(chdir(handle->root) != 0) {
+			_alpm_log(PM_LOG_ERROR, _("could not change directory to %s (%s)\n"), handle->root, strerror(errno));
+			ret = -1;
+			goto cleanup;
+		}
 
 		/* call PROGRESS once with 0 percent, as we sort-of skip that here */
 		if(is_upgrade) {
@@ -629,9 +635,11 @@ static int commit_single_pkg(pmpkg_t *newpkg, int pkg_current, int pkg_count,
 		}
 		archive_read_finish(archive);
 
-		/* restore the old cwd is we have it */
-		if(strlen(cwd)) {
-			chdir(cwd);
+		/* restore the old cwd if we have it */
+		if(restore_cwd) {
+			if(chdir(cwd) != 0) {
+				_alpm_log(PM_LOG_ERROR, _("could not change directory to %s (%s)\n"), cwd, strerror(errno));
+			}
 		}
 
 		if(errors) {
diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c
index b033e0a..383568c 100644
--- a/lib/libalpm/util.c
+++ b/lib/libalpm/util.c
@@ -365,7 +365,9 @@ cleanup:
 	umask(oldmask);
 	archive_read_finish(_archive);
 	if(restore_cwd) {
-		chdir(cwd);
+		if(chdir(cwd) != 0) {
+			_alpm_log(PM_LOG_ERROR, _("could not change directory to %s (%s)\n"), cwd, strerror(errno));
+		}
 	}
 	return(ret);
 }
@@ -535,7 +537,9 @@ int _alpm_run_chroot(const char *root, const char *cmd)
 
 cleanup:
 	if(restore_cwd) {
-		chdir(cwd);
+		if(chdir(cwd) != 0) {
+			_alpm_log(PM_LOG_ERROR, _("could not change directory to %s (%s)\n"), cwd, strerror(errno));
+		}
 	}
 
 	return(retval);
diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
index 78407d6..913b487 100644
--- a/src/pacman/pacman.c
+++ b/src/pacman/pacman.c
@@ -676,6 +676,7 @@ int download_with_xfercommand(const char *url, const char *localpath,
 	struct stat st;
 	char *parsedcmd,*tempcmd;
 	char cwd[PATH_MAX];
+	int restore_cwd = 0;
 	char *destfile, *tempfile, *filename;
 
 	if(!config->xfercommand) {
@@ -708,8 +709,14 @@ int download_with_xfercommand(const char *url, const char *localpath,
 	parsedcmd = strreplace(tempcmd, "%u", url);
 	free(tempcmd);
 
+	/* save the cwd so we can restore it later */
+	if(getcwd(cwd, PATH_MAX) == NULL) {
+		pm_printf(PM_LOG_ERROR, _("could not get current working directory\n"));
+	} else {
+		restore_cwd = 1;
+	}
+
 	/* cwd to the download directory */
-	getcwd(cwd, PATH_MAX);
 	if(chdir(localpath)) {
 		pm_printf(PM_LOG_WARNING, _("could not chdir to download directory %s\n"), localpath);
 		ret = -1;
@@ -736,7 +743,13 @@ int download_with_xfercommand(const char *url, const char *localpath,
 	}
 
 cleanup:
-	chdir(cwd);
+	/* restore the old cwd if we have it */
+	if(restore_cwd) {
+		if(chdir(cwd) != 0) {
+			pm_printf(PM_LOG_ERROR, _("could not change directory to %s (%s)\n"), cwd, strerror(errno));
+		}
+	}
+		
 	if(ret == -1) {
 		/* hack to let an user the time to cancel a download */
 		sleep(2);
-- 
1.7.1



More information about the pacman-dev mailing list