summaryrefslogtreecommitdiffstats
path: root/lib/libalpm/be_sync.c
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2011-04-01 21:31:50 +0200
committerDan McGee <dan@archlinux.org>2011-04-01 21:31:50 +0200
commit39fd8bc318d4a90aab704f892cd80c22f5c7345f (patch)
treef664a223aaf42a25c4abf36295988933cd6c0cbe /lib/libalpm/be_sync.c
parent20c4928ee155db7b43b9f5b440a2cb199f178bb4 (diff)
downloadpacman-39fd8bc318d4a90aab704f892cd80c22f5c7345f.tar.gz
pacman-39fd8bc318d4a90aab704f892cd80c22f5c7345f.tar.xz
Ensure dbpath is not null when populating sync database
We didn't do this sanity check before trying to open an archive. If the alpm dbpath wasn't set, the sync database dbpath would be NULL, causing us to hang indefinitely in archive_read_open_filename() rather than erroring out. We already have a corresponding check in local_db_populate(). The following program will test this case, and hangs before this patch without the call to set_dbpath: int main(int argc, char *argv[]) { alpm_initialize(); // alpm_option_set_dbpath("/var/lib/pacman/"); pmdb_t *core = alpm_db_register_sync("core"); pmpkg_t *pkg = alpm_db_get_pkg(core, "pacman"); return 0; } Signed-off-by: Dan McGee <dan@archlinux.org>
Diffstat (limited to 'lib/libalpm/be_sync.c')
-rw-r--r--lib/libalpm/be_sync.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c
index 5a13adda..ef8517e3 100644
--- a/lib/libalpm/be_sync.c
+++ b/lib/libalpm/be_sync.c
@@ -209,6 +209,7 @@ static size_t estimate_package_count(struct stat *st, struct archive *archive)
static int sync_db_populate(pmdb_t *db)
{
+ const char *dbpath;
size_t est_count;
int count = 0;
struct stat buf;
@@ -226,14 +227,22 @@ static int sync_db_populate(pmdb_t *db)
archive_read_support_compression_all(archive);
archive_read_support_format_all(archive);
- if(archive_read_open_filename(archive, _alpm_db_path(db),
+ dbpath = _alpm_db_path(db);
+ if(!dbpath) {
+ /* pm_errno set in _alpm_db_path() */
+ return 1;
+ }
+
+ _alpm_log(PM_LOG_DEBUG, "opening database archive %s\n", dbpath);
+
+ if(archive_read_open_filename(archive, dbpath,
ARCHIVE_DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) {
- _alpm_log(PM_LOG_ERROR, _("could not open file %s: %s\n"), _alpm_db_path(db),
+ _alpm_log(PM_LOG_ERROR, _("could not open file %s: %s\n"), dbpath,
archive_error_string(archive));
archive_read_finish(archive);
RET_ERR(PM_ERR_DB_OPEN, 1);
}
- if(stat(_alpm_db_path(db), &buf) != 0) {
+ if(stat(dbpath, &buf) != 0) {
RET_ERR(PM_ERR_DB_OPEN, 1);
}
est_count = estimate_package_count(&buf, archive);