Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com> --- See FS#49342 for an example of how to break a database in a way that was previously silently ignored. The linked github issue includes a copy of an actual broken db. lib/libalpm/be_sync.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c index 5f7d31ab..06f509a6 100644 --- a/lib/libalpm/be_sync.c +++ b/lib/libalpm/be_sync.c @@ -465,6 +465,7 @@ static int sync_db_populate(alpm_db_t *db) size_t est_count, count; int fd; int ret = 0; + int archive_ret; struct stat buf; struct archive *archive; struct archive_entry *entry; @@ -502,20 +503,26 @@ static int sync_db_populate(alpm_db_t *db) goto cleanup; } - while(archive_read_next_header(archive, &entry) == ARCHIVE_OK) { + while((archive_ret = archive_read_next_header(archive, &entry)) == ARCHIVE_OK) { mode_t mode = archive_entry_mode(entry); - if(S_ISDIR(mode)) { - continue; - } else { + if(!S_ISDIR(mode)) { /* we have desc, depends or deltas - parse it */ if(sync_db_read(db, archive, entry, &pkg) != 0) { _alpm_log(db->handle, ALPM_LOG_ERROR, _("could not parse package description file '%s' from db '%s'\n"), archive_entry_pathname(entry), db->treename); - continue; + ret = -1; } } } + if(archive_ret != ARCHIVE_EOF) { + _alpm_log(db->handle, ALPM_LOG_ERROR, _("could not read db '%s' (%s)\n"), + db->treename, archive_error_string(archive)); + _alpm_db_free_pkgcache(db); + db->handle->pm_errno = ALPM_ERR_LIBARCHIVE; + ret = -1; + goto cleanup; + } count = alpm_list_count(db->pkgcache->list); if(count > 0) { -- 2.12.2