[pacman-dev] [BUG] alpm_list_remove need an initalized pointer for void **data

solsTiCe d'Hiver solstice.dhiver at gmail.com
Thu Aug 7 08:42:42 EDT 2008


hi.

i am playing with alpm and db4 to make a little program for me. just for fun.

and in this new release of libalpm (along pacman 3.2.0) i have found that 
alpm_list_remove behave differently than before. so the last parameter (void 
**data) need to be initialized to avoid a seg fault.

it happens in alpm_db_unregister if you unregister a sync db 
if you run this, you will see it happen

#include <stdio.h>
#include <stdlib.h>
#include <alpm.h>

int main(void) {
    pmdb_t *db;
    pmpkg_t *pkg;
    const char *s;

    alpm_initialize();
    alpm_option_set_root("/");
    alpm_option_set_dbpath("/var/lib/pacman");
    alpm_option_add_cachedir("/var/cache/pacman/pkg");
    alpm_option_set_logfile("/dev/stdout");
    db = alpm_db_register_sync("extra");
    puts("alpm_db_unregister(db)");
    alpm_db_unregister(db);
    puts("alpm_release()");
    alpm_release();
    exit(EXIT_SUCCESS);
}

i wonder how it has not generated more bug in libalpm.

so i check all uninitalised pointer in libalpm before alpm_list_remove and i 
found 3 occurences
see the patch

diff --git a/lib/libalpm/cache.c b/lib/libalpm/cache.c
index 032cc97..b7681db 100644
--- a/lib/libalpm/cache.c
+++ b/lib/libalpm/cache.c
@@ -135,7 +135,7 @@ int _alpm_db_add_pkgincache(pmdb_t *db, pmpkg_t *pkg)
 
 int _alpm_db_remove_pkgfromcache(pmdb_t *db, pmpkg_t *pkg)
 {
-	void *vdata;
+	void *vdata=NULL;
 	pmpkg_t *data;
 
 	ALPM_LOG_FUNC;
diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c
index d9a3931..c0d322c 100644
--- a/lib/libalpm/db.c
+++ b/lib/libalpm/db.c
@@ -145,7 +145,7 @@ int SYMEXPORT alpm_db_unregister(pmdb_t *db)
 		 * databases by walking through the list returned by
 		 * alpm_option_get_syncdbs, because the db is removed from that list here.
 		 */
-		void *data;
+		void *data=NULL;
 		handle->dbs_sync = alpm_list_remove(handle->dbs_sync,
 				db, _alpm_db_cmp, &data);
 		if(data) {
diff --git a/lib/libalpm/remove.c b/lib/libalpm/remove.c
index 864fafa..6ea16c0 100644
--- a/lib/libalpm/remove.c
+++ b/lib/libalpm/remove.c
@@ -118,7 +118,7 @@ static void remove_prepare_keep_needed(pmtrans_t *trans, 
pmdb_t *db,
 		alpm_list_t *i;
 		for(i = lp; i; i = i->next) {
 			pmdepmissing_t *miss = (pmdepmissing_t *)i->data;
-			void *vpkg;
+			void *vpkg=NULL;
 			pmpkg_t *pkg = _alpm_pkg_find(trans->packages, miss->causingpkg);
 			if(pkg == NULL) {
 				continue;





More information about the pacman-dev mailing list