summaryrefslogtreecommitdiffstats
path: root/lib/libalpm/be_local.c
diff options
context:
space:
mode:
authorPang Yan Han <pangyanhan@gmail.com>2011-02-07 23:59:04 +0100
committerDan McGee <dan@archlinux.org>2011-02-08 03:21:34 +0100
commitbe9a60a338fd8591918711f5e826012a0d83136e (patch)
tree9dbbda0e153e6215180e2430bb71e4c1054645e3 /lib/libalpm/be_local.c
parentbb071f4eb20810216b731f6792a32c148eb78931 (diff)
downloadpacman-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.c4
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;