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

Use strdup() instead of a static buffer

We only need a copy of this string once we know we are going to extract it,
and we don't need a static buffer to copy it into since it is coming from a
known-length string.

Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Dan McGee 2008-05-04 20:51:04 -05:00
parent 081ba4816e
commit df5024fd64

View File

@ -278,17 +278,18 @@ static int extract_single_file(struct archive *archive,
struct archive_entry *entry, pmpkg_t *newpkg, pmpkg_t *oldpkg, struct archive_entry *entry, pmpkg_t *newpkg, pmpkg_t *oldpkg,
pmtrans_t *trans, pmdb_t *db) pmtrans_t *trans, pmdb_t *db)
{ {
char entryname[PATH_MAX]; /* the name of the file in the archive */ const char *entryname;
mode_t entrymode; mode_t entrymode;
char filename[PATH_MAX]; /* the actual file we're extracting */ char filename[PATH_MAX]; /* the actual file we're extracting */
int needbackup = 0, notouch = 0; int needbackup = 0, notouch = 0;
char *hash_orig = NULL; char *hash_orig = NULL;
char *entryname_orig = NULL;
const int archive_flags = ARCHIVE_EXTRACT_OWNER | const int archive_flags = ARCHIVE_EXTRACT_OWNER |
ARCHIVE_EXTRACT_PERM | ARCHIVE_EXTRACT_PERM |
ARCHIVE_EXTRACT_TIME; ARCHIVE_EXTRACT_TIME;
int errors = 0; int errors = 0;
strncpy(entryname, archive_entry_pathname(entry), PATH_MAX); entryname = archive_entry_pathname(entry);
entrymode = archive_entry_mode(entry); entrymode = archive_entry_mode(entry);
memset(filename, 0, PATH_MAX); /* just to be sure */ memset(filename, 0, PATH_MAX); /* just to be sure */
@ -326,7 +327,8 @@ static int extract_single_file(struct archive *archive,
/* if a file is in the add skiplist we never extract it */ /* if a file is in the add skiplist we never extract it */
if(alpm_list_find_str(trans->skip_add, filename)) { if(alpm_list_find_str(trans->skip_add, filename)) {
_alpm_log(PM_LOG_DEBUG, "%s is in trans->skip_add, skipping extraction\n", entryname); _alpm_log(PM_LOG_DEBUG, "%s is in trans->skip_add, skipping extraction\n",
entryname);
archive_read_data_skip(archive); archive_read_data_skip(archive);
return(0); return(0);
} }
@ -433,6 +435,10 @@ static int extract_single_file(struct archive *archive,
/* case 5,8: don't need to do anything special */ /* case 5,8: don't need to do anything special */
} }
/* we need access to the original entryname later after calls to
* archive_entry_set_pathname(), so we need to dupe it and free() later */
STRDUP(entryname_orig, entryname, RET_ERR(PM_ERR_MEMORY, -1));
if(needbackup) { if(needbackup) {
char checkfile[PATH_MAX]; char checkfile[PATH_MAX];
char *hash_local = NULL, *hash_pkg = NULL; char *hash_local = NULL, *hash_pkg = NULL;
@ -445,13 +451,14 @@ static int extract_single_file(struct archive *archive,
if(ret == ARCHIVE_WARN) { if(ret == ARCHIVE_WARN) {
/* operation succeeded but a non-critical error was encountered */ /* operation succeeded but a non-critical error was encountered */
_alpm_log(PM_LOG_DEBUG, "warning extracting %s (%s)\n", _alpm_log(PM_LOG_DEBUG, "warning extracting %s (%s)\n",
entryname, archive_error_string(archive)); entryname_orig, archive_error_string(archive));
} else if(ret != ARCHIVE_OK) { } else if(ret != ARCHIVE_OK) {
_alpm_log(PM_LOG_ERROR, _("could not extract %s (%s)\n"), _alpm_log(PM_LOG_ERROR, _("could not extract %s (%s)\n"),
entryname, archive_error_string(archive)); entryname_orig, archive_error_string(archive));
alpm_logaction("error: could not extract %s (%s)\n", alpm_logaction("error: could not extract %s (%s)\n",
entryname, archive_error_string(archive)); entryname_orig, archive_error_string(archive));
FREE(hash_orig); FREE(hash_orig);
FREE(entryname_orig);
return(1); return(1);
} }
@ -464,7 +471,7 @@ static int extract_single_file(struct archive *archive,
for(backups = alpm_pkg_get_backup(newpkg); backups; for(backups = alpm_pkg_get_backup(newpkg); backups;
backups = alpm_list_next(backups)) { backups = alpm_list_next(backups)) {
char *oldbackup = alpm_list_getdata(backups); char *oldbackup = alpm_list_getdata(backups);
if(!oldbackup || strcmp(oldbackup, entryname) != 0) { if(!oldbackup || strcmp(oldbackup, entryname_orig) != 0) {
continue; continue;
} }
char *backup = NULL; char *backup = NULL;
@ -478,7 +485,7 @@ static int extract_single_file(struct archive *archive,
backups->data = backup; backups->data = backup;
} }
_alpm_log(PM_LOG_DEBUG, "checking hashes for %s\n", entryname); _alpm_log(PM_LOG_DEBUG, "checking hashes for %s\n", entryname_orig);
_alpm_log(PM_LOG_DEBUG, "current: %s\n", hash_local); _alpm_log(PM_LOG_DEBUG, "current: %s\n", hash_local);
_alpm_log(PM_LOG_DEBUG, "new: %s\n", hash_pkg); _alpm_log(PM_LOG_DEBUG, "new: %s\n", hash_pkg);
_alpm_log(PM_LOG_DEBUG, "original: %s\n", hash_orig); _alpm_log(PM_LOG_DEBUG, "original: %s\n", hash_orig);
@ -518,7 +525,7 @@ static int extract_single_file(struct archive *archive,
/* installed file has NOT been changed by user */ /* installed file has NOT been changed by user */
if(strcmp(hash_orig, hash_pkg) != 0) { if(strcmp(hash_orig, hash_pkg) != 0) {
_alpm_log(PM_LOG_DEBUG, "action: installing new file: %s\n", _alpm_log(PM_LOG_DEBUG, "action: installing new file: %s\n",
entryname); entryname_orig);
if(rename(checkfile, filename)) { if(rename(checkfile, filename)) {
_alpm_log(PM_LOG_ERROR, _("could not rename %s to %s (%s)\n"), _alpm_log(PM_LOG_ERROR, _("could not rename %s to %s (%s)\n"),
@ -547,7 +554,8 @@ static int extract_single_file(struct archive *archive,
unlink(checkfile); unlink(checkfile);
} else { } else {
char newpath[PATH_MAX]; char newpath[PATH_MAX];
_alpm_log(PM_LOG_DEBUG, "action: keeping current file and installing new one with .pacnew ending\n"); _alpm_log(PM_LOG_DEBUG, "action: keeping current file and installing"
" new one with .pacnew ending\n");
snprintf(newpath, PATH_MAX, "%s.pacnew", filename); snprintf(newpath, PATH_MAX, "%s.pacnew", filename);
if(rename(checkfile, newpath)) { if(rename(checkfile, newpath)) {
_alpm_log(PM_LOG_ERROR, _("could not install %s as %s (%s)\n"), _alpm_log(PM_LOG_ERROR, _("could not install %s as %s (%s)\n"),
@ -593,12 +601,13 @@ static int extract_single_file(struct archive *archive,
if(ret == ARCHIVE_WARN) { if(ret == ARCHIVE_WARN) {
/* operation succeeded but a non-critical error was encountered */ /* operation succeeded but a non-critical error was encountered */
_alpm_log(PM_LOG_DEBUG, "warning extracting %s (%s)\n", _alpm_log(PM_LOG_DEBUG, "warning extracting %s (%s)\n",
entryname, archive_error_string(archive)); entryname_orig, archive_error_string(archive));
} else if(ret != ARCHIVE_OK) { } else if(ret != ARCHIVE_OK) {
_alpm_log(PM_LOG_ERROR, _("could not extract %s (%s)\n"), _alpm_log(PM_LOG_ERROR, _("could not extract %s (%s)\n"),
entryname, archive_error_string(archive)); entryname_orig, archive_error_string(archive));
alpm_logaction("error: could not extract %s (%s)\n", alpm_logaction("error: could not extract %s (%s)\n",
entryname, archive_error_string(archive)); entryname_orig, archive_error_string(archive));
FREE(entryname_orig);
return(1); return(1);
} }
@ -610,7 +619,7 @@ static int extract_single_file(struct archive *archive,
/* length is tab char, null byte and MD5 (32 char) */ /* length is tab char, null byte and MD5 (32 char) */
size_t backup_len = strlen(oldbackup) + 34; size_t backup_len = strlen(oldbackup) + 34;
if(!oldbackup || strcmp(oldbackup, entryname) != 0) { if(!oldbackup || strcmp(oldbackup, entryname_orig) != 0) {
continue; continue;
} }
_alpm_log(PM_LOG_DEBUG, "appending backup entry for %s\n", filename); _alpm_log(PM_LOG_DEBUG, "appending backup entry for %s\n", filename);
@ -625,6 +634,7 @@ static int extract_single_file(struct archive *archive,
b->data = backup; b->data = backup;
} }
} }
FREE(entryname_orig);
return(errors); return(errors);
} }