RPM Community Forums

Mailing List Message of <rpm-devel>

Re: memory leakage in rpmdbNextIterator (rpm 4.4.2.1)

From: Jeff Johnson <n3npq@mac.com>
Date: Wed 19 Dec 2007 - 17:44:37 CET
Message-Id: <9439284C-1801-4AF4-97ED-383115CFD4D5@mac.com>

On Dec 19, 2007, at 11:39 AM, Pazzo Da Legare wrote:

> Dear ML,
>
> Probably I'm OT...and surely I'm wrong but it seems to me that there
> is a memory leakage in the
> rpmdbNextIterator()....it leaks 990 bytes each
> time I call the function dumpPackages in my configuration
> (RHcore6)...or probably I'm wrong...
> (I'm using rpm 4.4.2.1)
>
> I hope you could help me,
>

SInce the memory leak is in rpm-4.4.2.1, you'll need
to address the issue on <rpm-maint@lists.dulug.duke.edu>.

Meanwhile, add a call
     rpmtsSetVSFlags(ts, -1)
to disable digest/signature checking. That will avoid (but not fix)
the memory leak.

hth

73 de Jeff

> pazzodalegare
>
>
>
> I'm using the following code:
>
> --------------------------BEGIN EXAMPLE----------------------------
> //in rpmquery.c
> char **dumpPackages(int *numPkg, char **perrMsg, int onlypkgName){
>        Header h;
>        rpmts ts;
>        int rc, MaxPkg = 1000, l, MaxPkgIncr=500;
>        char *name, *ver, *rel, **pkgs=NULL, **tmpPkgs;
>
>        *numPkg = 0; *perrMsg = NULL;
>
>        //necessario per impostare il dbpath
>        rpmReadConfigFiles( NULL, NULL );
>        ts = rpmtsCreate();
>        rc = rpmtsOpenDB(ts, O_RDONLY);
>
>        if( rc != 0 ) {
>                fprintf( stderr, "cannot open RPM database.\n" );
>                return ( pkgs );
>        }
>
>        rpmdbMatchIterator mi = rpmtsInitIterator(ts, RPMTAG_NAME,  
> NULL, 0);
>        tmpPkgs = (char **)calloc(MaxPkg, sizeof(char *));
>
>        while( (h=rpmdbNextIterator(mi) )!=NULL ) {
>                if(h){
>                        name=NULL; ver=NULL; rel=NULL;
>                        headerNVR(h,(const char **)&name, (const char
> **)&ver, (const char
> **) &rel );
>                        //printf("Name %s; Version %s; Release %s",
> name, ver ,rel);
>                        l=(int)(strlen(name)+strlen(ver)+strlen(rel) 
> +2+1);
>                        tmpPkgs[(*numPkg)] = malloc( l*sizeof(char) );
>
>                        if(onlypkgName) snprintf(
> tmpPkgs[(*numPkg)],l,"%s", name);
>                        else snprintf(
> tmpPkgs[(*numPkg)],l,"%s-%s-%s",name,ver,rel);
>                        (*numPkg)++;
>                        if(*numPkg >= MaxPkg){
>                                MaxPkg += MaxPkgIncr;
>                                tmpPkgs = realloc(tmpPkgs, sizeof(char
> *)*MaxPkg);
>                        }
>                }
>        }
>        pkgs = realloc(tmpPkgs, (*numPkg)*sizeof(char *) );
>        rpmdbFreeIterator(mi);
>        rpmtsCloseDB(ts);
>        ts = rpmtsFree(ts);
>        return pkgs;
> }
>
> // in main.c
>
>
> void freevec(void **v, int l){
>        int i;
>        if(v==NULL || l<=0)
>                return;
>        for(i=0; i<l; i++)
>                free(v[i]);
>        free(v);
> }
>
> int main(int argc, char *argv[]){
>        int n, errcode,i;
>        char *errmsg, **files;
>        printf("\n");
>        for(i=0; i<1; i++){
>                files = dumpPackages(&n, &errmsg, 0);
>                freevec((void *)files, n);
>        }
>        return 0;
> }
> ---------------------------END EXAMPLE
>
> I was looking for memory leakage with valgrind and I got:
>
>  valgrind --leak-check=yes   Debug/test_spxpmsutil  > /tmp/ 
> noheaderFree.log
> ==14158== Memcheck, a memory error detector.
> ==14158== Copyright (C) 2002-2006, and GNU GPL'd, by Julian Seward  
> et al.
> ==14158== Using LibVEX rev 1658, a library for dynamic binary  
> translation.
> ==14158== Copyright (C) 2004-2006, and GNU GPL'd, by OpenWorks LLP.
> ==14158== Using valgrind-3.2.1, a dynamic binary instrumentation  
> framework.
> ==14158== Copyright (C) 2000-2006, and GNU GPL'd, by Julian Seward  
> et al.
> ==14158== For more details, rerun with: -v
> ==14158==
> ==14158==
> ==14158== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 31  
> from 1)
> ==14158== malloc/free: in use at exit: 68,531 bytes in 2,984 blocks.
> ==14158== malloc/free: 35,750 allocs, 32,766 frees, 40,975,637  
> bytes allocated.
> ==14158== For counts of detected errors, rerun with: -v
> ==14158== searching for pointers to 2,984 not-freed blocks.
> ==14158== checked 732,568 bytes.
> ==14158==
> ==14158== 990 bytes in 20 blocks are definitely lost in loss record  
> 18 of 32
> ==14158==    at 0x4005400: malloc (vg_replace_malloc.c:149)
> ==14158==    by 0xBCD340: pgpPrtUserID (in /usr/lib/librpmio-4.4.so)
> ==14158==    by 0xBCF487: pgpPrtPkt (in /usr/lib/librpmio-4.4.so)
> ==14158==    by 0xBCF5CC: pgpPrtPkts (in /usr/lib/librpmio-4.4.so)
> ==14158==    by 0xD1711A: rpmtsFindPubkey (in /usr/lib/librpm-4.4.so)
> ==14158==    by 0xD188F3: (within /usr/lib/librpm-4.4.so)
> ==14158==    by 0xD1A07B: rpmVerifySignature (in /usr/lib/ 
> librpm-4.4.so)
> ==14158==    by 0xCF1BE1: headerCheck (in /usr/lib/librpm-4.4.so)
> ==14158==    by 0x4042374: rpmdbNextIterator (in /usr/lib/ 
> librpmdb-4.4.so)
> ==14158==    by 0x804DF8A: dumpPackages (rpmqueryop.c:290)
> ==14158==    by 0x804E027: main (main.c:17)
> ==14158==
> ==14158== LEAK SUMMARY:
> ==14158==    definitely lost: 990 bytes in 20 blocks.
> ==14158==      possibly lost: 0 bytes in 0 blocks.
> ==14158==    still reachable: 67,541 bytes in 2,964 blocks.
> ==14158==         suppressed: 0 bytes in 0 blocks.
> ==14158== Reachable blocks (those to which a pointer was found) are  
> not shown.
> ==14158== To see them, rerun with: --show-reachable=yes
> ______________________________________________________________________
> RPM Package Manager                                    http://rpm5.org
> Developer Communication List                        rpm-devel@rpm5.org
Received on Wed Dec 19 17:44:51 2007
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.