diff options
author | Pang Yan Han <pangyanhan@gmail.com> | 2011-02-07 23:59:04 +0100 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2011-02-08 03:21:34 +0100 |
commit | be9a60a338fd8591918711f5e826012a0d83136e (patch) | |
tree | 9dbbda0e153e6215180e2430bb71e4c1054645e3 /lib/libalpm/be_local.c | |
parent | bb071f4eb20810216b731f6792a32c148eb78931 (diff) | |
download | pacman-be9a60a338fd8591918711f5e826012a0d83136e.tar.gz pacman-be9a60a338fd8591918711f5e826012a0d83136e.tar.xz |
Handle null pkgcache for local/sync db_populate()
In sync_db_populate() and local_db_populate(), a NULL db->pkgcache is not
caught, allowing the functions to continue instead of exiting.
A later alpm_list_msort() call which uses alpm_list_nth() will thus traverse
invalid pointers in a non-existent db->pkgcache->list.
pm_errno is set to PM_ERR_MEMORY as _alpm_pkghash_create() will only return
NULL when we run out of memory / exceed max hash table size. The local/sync
db_populate() functions are also exited.
Signed-off-by: Pang Yan Han <pangyanhan@gmail.com>
Signed-off-by: Dan McGee <dan@archlinux.org>
Diffstat (limited to 'lib/libalpm/be_local.c')
-rw-r--r-- | lib/libalpm/be_local.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/lib/libalpm/be_local.c b/lib/libalpm/be_local.c index c5b24982..58582705 100644 --- a/lib/libalpm/be_local.c +++ b/lib/libalpm/be_local.c @@ -393,6 +393,10 @@ static int local_db_populate(pmdb_t *db) /* initialize hash at 50% full */ db->pkgcache = _alpm_pkghash_create(est_count * 2); + if(db->pkgcache == NULL){ + closedir(dbdir); + RET_ERR(PM_ERR_MEMORY, -1); + } while((ent = readdir(dbdir)) != NULL) { const char *name = ent->d_name; |