From 4b7f7e2a59457aa881ae883b6d102f9fc62e2ed8 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Tue, 8 Apr 2008 18:38:54 -0500 Subject: Correctly use the fd returned my mkstemp() There were a few issues with this code: 1. We already had an open fd to a file, but never used it to our benefit. Use the libarchive convienence method to write the current file contents straight to a file descriptor. 2. The real problem cropped up on Windows where the locking semantics caused the old way of extraction to fail because we had an open file descriptor. By using the file descriptor and closing it ASAP, we prevent these failures. Signed-off-by: Dan McGee --- lib/libalpm/add.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c index 42015224..0a1a1924 100644 --- a/lib/libalpm/add.c +++ b/lib/libalpm/add.c @@ -446,7 +446,7 @@ static int extract_single_file(struct archive *archive, } if(needbackup) { - char *tempfile = NULL; + char *tempfile; char *hash_local = NULL, *hash_pkg = NULL; int fd; @@ -454,9 +454,8 @@ static int extract_single_file(struct archive *archive, tempfile = strdup("/tmp/alpm_XXXXXX"); fd = mkstemp(tempfile); - archive_entry_set_pathname(entry, tempfile); - - int ret = archive_read_extract(archive, entry, archive_flags); + int ret = archive_read_data_into_fd(archive, fd); + close(fd); if(ret == ARCHIVE_WARN) { /* operation succeeded but a non-critical error was encountered */ _alpm_log(PM_LOG_DEBUG, "warning extracting %s (%s)\n", @@ -467,8 +466,8 @@ static int extract_single_file(struct archive *archive, alpm_logaction("error: could not extract %s (%s)\n", entryname, archive_error_string(archive)); unlink(tempfile); + FREE(tempfile); FREE(hash_orig); - close(fd); return(1); } @@ -578,7 +577,6 @@ static int extract_single_file(struct archive *archive, FREE(hash_orig); unlink(tempfile); FREE(tempfile); - close(fd); } else { /* we didn't need a backup */ if(notouch) { -- cgit v1.2.3-24-g4f1b