Date: Saturday, February 3, 2007 @ 22:24:32 Author: aaron Path: /home/cvs-pacman/pacman-lib Modified: lib/libalpm/package.c (1.55 -> 1.56) src/pacman/add.c (1.29 -> 1.30) src/pacman/log.c (1.26 -> 1.27) * Added archive verification when loading package metadata for -u and -A operations (now aborts on a corrupt archive) * Fixed the pm_fprintf newline error that was plaguing us. It seems a line resetting 'neednl' was removed a while back (by me). This causes all the output errors we've been seeing -----------------------+ lib/libalpm/package.c | 43 +++++++++++++++++++++++++++---------------- src/pacman/add.c | 2 +- src/pacman/log.c | 6 +++--- 3 files changed, 31 insertions(+), 20 deletions(-) Index: pacman-lib/lib/libalpm/package.c diff -u pacman-lib/lib/libalpm/package.c:1.55 pacman-lib/lib/libalpm/package.c:1.56 --- pacman-lib/lib/libalpm/package.c:1.55 Wed Jan 31 22:00:34 2007 +++ pacman-lib/lib/libalpm/package.c Sat Feb 3 22:24:32 2007 @@ -237,7 +237,7 @@ pmpkg_t *_alpm_pkg_load(char *pkgfile) { char *expath; - int i; + int ret = ARCHIVE_OK; int config = 0; int filelist = 0; int scriptcheck = 0; @@ -254,32 +254,36 @@ RET_ERR(PM_ERR_WRONG_ARGS, NULL); } - if ((archive = archive_read_new ()) == NULL) + if((archive = archive_read_new()) == NULL) { RET_ERR(PM_ERR_LIBARCHIVE_ERROR, NULL); + } - archive_read_support_compression_all (archive); - archive_read_support_format_all (archive); + archive_read_support_compression_all(archive); + archive_read_support_format_all(archive); - if (archive_read_open_file (archive, pkgfile, ARCHIVE_DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) + if (archive_read_open_file(archive, pkgfile, ARCHIVE_DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) { RET_ERR(PM_ERR_PKG_OPEN, NULL); + } info = _alpm_pkg_new(NULL, NULL); if(info == NULL) { - archive_read_finish (archive); + archive_read_finish(archive); RET_ERR(PM_ERR_MEMORY, NULL); } /* TODO there is no reason to make temp files to read * from a libarchive archive, it can be done by reading - * directly from the archive */ - for(i = 0; archive_read_next_header (archive, &entry) == ARCHIVE_OK; i++) { + * directly from the archive + * See: archive_read_data_into_buffer + * requires changes 'parse_descfile' as well + * */ + + /* Read through the entire archive for metadata. We will continue reading + * even if all metadata is found, to verify the integrity of the archive in + * full */ + while((ret = archive_read_next_header (archive, &entry)) == ARCHIVE_OK) { const char *entry_name = archive_entry_pathname(entry); - if(config && filelist && scriptcheck) { - /* we have everything we need */ - break; - } - if(strcmp(entry_name, ".PKGINFO") == 0) { /* extract this file into /tmp. it has info for us */ descfile = strdup("/tmp/alpm_XXXXXX"); @@ -343,18 +347,25 @@ } if(archive_read_data_skip(archive)) { - _alpm_log(PM_LOG_ERROR, _("bad package file in %s"), pkgfile); + _alpm_log(PM_LOG_ERROR, _("error while reading package: %s"), archive_error_string(archive)); + pm_errno = PM_ERR_LIBARCHIVE_ERROR; goto error; } expath = NULL; } - archive_read_finish(archive); + if(ret != ARCHIVE_EOF) { /* An error occured */ + _alpm_log(PM_LOG_ERROR, _("error while reading package: %s"), archive_error_string(archive)); + pm_errno = PM_ERR_LIBARCHIVE_ERROR; + goto error; + } if(!config) { - _alpm_log(PM_LOG_ERROR, _("missing package info file in %s"), pkgfile); + _alpm_log(PM_LOG_ERROR, _("missing package metadata"), pkgfile); goto error; } + archive_read_finish(archive); + if(!filelist) { _alpm_log(PM_LOG_ERROR, _("missing package filelist in %s, generating one"), pkgfile); info->files = all_files; Index: pacman-lib/src/pacman/add.c diff -u pacman-lib/src/pacman/add.c:1.29 pacman-lib/src/pacman/add.c:1.30 --- pacman-lib/src/pacman/add.c:1.29 Sat Feb 3 02:29:51 2007 +++ pacman-lib/src/pacman/add.c Sat Feb 3 22:24:32 2007 @@ -77,7 +77,7 @@ for(i = targets; i; i = i->next) { if(alpm_trans_addtarget(i->data) == -1) { MSG(NL, "\n"); - ERR(NL, _("failed to add target '%s' (%s)\n"), (char *)i->data, alpm_strerror(pm_errno)); + ERR(NL, _("failed to add target '%s' (%s)"), (char *)i->data, alpm_strerror(pm_errno)); retval = 1; goto cleanup; } Index: pacman-lib/src/pacman/log.c diff -u pacman-lib/src/pacman/log.c:1.26 pacman-lib/src/pacman/log.c:1.27 --- pacman-lib/src/pacman/log.c:1.26 Wed Jan 31 01:10:22 2007 +++ pacman-lib/src/pacman/log.c Sat Feb 3 22:24:32 2007 @@ -126,19 +126,19 @@ } fprintf(file, str); + if(needpad == 1) { unsigned int i, cols = getcols(); for(i=len; i < cols; ++i) { fprintf(file, " "); } - if(neednl == 1) { + if(neednl == 1 && line == NL) { fprintf(file, "\n"); neednl = 0; - } else { - neednl = 1; } } fflush(file); + neednl = (str[strlen(str)-1] == '\n') ? 0 : 1; } /* Check verbosity option and, if set, print the