[pacman-dev] CVS update of pacman-lib (3 files)

Aaron Griffin aaron at archlinux.org
Sat Feb 3 22:24:32 EST 2007


    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




More information about the pacman-dev mailing list