1
0
mirror of https://github.com/moparisthebest/pacman synced 2024-12-22 15:58:50 -05:00

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 <dan@archlinux.org>
This commit is contained in:
Dan McGee 2008-04-08 18:38:54 -05:00
parent bec2ba5b40
commit 4b7f7e2a59

View File

@ -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) {