On Thu, Aug 7, 2008 at 7:42 AM, solsTiCe d'Hiver <[EMAIL PROTECTED]> wrote: > 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.
I think the problem is something different; note the problem occurs in db_cmp: Program received signal SIGSEGV, Segmentation fault. _alpm_db_cmp (d1=0x97b60f0, d2=0x97b60f0) at db.c:363 363 return(strcmp(db1->treename, db2->treename)); (gdb) bt #0 _alpm_db_cmp (d1=0x97b60f0, d2=0x97b60f0) at db.c:363 #1 0xb8006a8c in alpm_list_remove (haystack=0x97b6140, needle=0x97b60f0, fn=0xb800d5b0 <_alpm_db_cmp>, data=0xbf841064) at alpm_list.c:314 #2 0xb800ead2 in alpm_db_unregister (db=0x97b60f0) at db.c:149 #3 0x08048770 in main () at test.c:17 (gdb) p d1 $1 = (const void *) 0x97b60f0 (gdb) p d2 $2 = (const void *) 0x97b60f0 (gdb) p d1->treename Attempt to dereference a generic pointer. (gdb) p ((pmdb_t)d1)->treename $3 = 0x97b60f0 "\020a{\t0a{\t\220p{\t" (gdb) p ((pmdb_t)d2)->treename $4 = 0x0 I'm not completely sure what is going on here. Here is the start of list_remove. If data is anything except null, we set it to null anyway: alpm_list_t SYMEXPORT *alpm_list_remove(alpm_list_t *haystack, const void *needle, alpm_list_fn_cmp fn, void **data) { alpm_list_t *i = haystack, *tmp = NULL; if(data) { *data = NULL; } -Dan _______________________________________________ pacman-dev mailing list pacman-dev@archlinux.org http://archlinux.org/mailman/listinfo/pacman-dev