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

Dan McGee dpmcgee at gmail.com
Thu Aug 7 09:41:17 EDT 2008


On Thu, Aug 7, 2008 at 7:42 AM, solsTiCe d'Hiver
<solstice.dhiver at gmail.com> 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



More information about the pacman-dev mailing list