On Mon, 11 May 2009, Creative Innovative wrote:
Hi Folks, I am using a C utility that uses RPM to install packages. RPM Version:: rpm-4.6.0 When I run the C program with Valgrind. I get a bunch of memory leaks. Can someone let me know,if some of them are know or will it get fixed.
In general, the "still reachable" reports of valgrind aren't that interesting with rpm:
- For many things you need to call shutdown routines to free memory if you care. - For many things rpm does deliberate one-shot allocation of "static" data such as data structures around tag table, that it doesn't bother freeing on exit. Reports on other leaks are, of course, most welcome.
==13315== 72 bytes in 1 blocks are definitely lost in loss record 19 of 54 ==13315== at 0x4028122: calloc (vg_replace_malloc.c:397) ==13315== by 0x45E1E8F: PR_Calloc (in /lib/libnspr4.so) ==13315== by 0x42A1356: (within /lib/libnss3.so) ==13315== by 0x42A13A0: (within /lib/libnss3.so) ==13315== by 0x42A12B3: (within /lib/libnss3.so) ==13315== by 0x4297F7A: (within /lib/libnss3.so) ==13315== by 0x429C8C3: (within /lib/libnss3.so) ==13315== by 0x425E265: (within /lib/libnss3.so) ==13315== by 0x425E563: NSS_NoDB_Init (in /lib/libnss3.so) ==13315== by 0x40B7BFE: rpmInitCrypto (in /usr/lib/librpmio-4.6.so) ==13315== by 0x40768D9: rpmtsCreate (in /usr/lib/librpm-4.6.so) ==13315== by 0x804B3A3: executeTransactionUsingRpm (rpmutform.c:1698)
You need to call rpmFreeCrypto() to shut down NSS before exit if you want to get rid of this one.
==13315== 5 bytes in 1 blocks are still reachable in loss record 1 of 54 ==13315== at 0x402A06E: malloc (vg_replace_malloc.c:207) ==13315== by 0x4074380: (within /usr/lib/librpm-4.6.so) ==13315== by 0x4074F0D: rpmReadConfigFiles (in /usr/lib/librpm-4.6.so) ==13315== by 0x804B341: executeTransactionUsingRpm (rpmutform.c:1682) ==13315== by 0x80493DB: main (callRpmUtil.c:16) ==13315== ==13315== ==13315== 6 bytes in 1 blocks are still reachable in loss record 2 of 54 ==13315== at 0x402A06E: malloc (vg_replace_malloc.c:207) ==13315== by 0x40743F3: (within /usr/lib/librpm-4.6.so) ==13315== by 0x4074F8E: rpmReadConfigFiles (in /usr/lib/librpm-4.6.so) ==13315== by 0x804B341: executeTransactionUsingRpm (rpmutform.c:1682) ==13315== by 0x80493DB: main (callRpmUtil.c:16)
Call rpmFreeRpmrc() before exit.
==13315== ==13315== ==13315== 12 bytes in 8 blocks are still reachable in loss record 3 of 54 ==13315== at 0x402A06E: malloc (vg_replace_malloc.c:207) ==13315== by 0x40B06F0: addMacro (in /usr/lib/librpmio-4.6.so) ==13315== by 0x40B1E59: (within /usr/lib/librpmio-4.6.so) ==13315== by 0x40B1ED8: rpmDefineMacro (in /usr/lib/librpmio-4.6.so) ==13315== by 0x40B1FA1: rpmLoadMacroFile (in /usr/lib/librpmio-4.6.so) ==13315== by 0x40B21E2: rpmInitMacros (in /usr/lib/librpmio-4.6.so) ==13315== by 0x4074F4A: rpmReadConfigFiles (in /usr/lib/librpm-4.6.so) ==13315== by 0x804B341: executeTransactionUsingRpm (rpmutform.c:1682) ==13315== by 0x80493DB: main (callRpmUtil.c:16)
Call rpmFreeMacros() before exit.
==13315== ==13315== 16 bytes in 2 blocks are still reachable in loss record 4 of 54 ==13315== at 0x402A06E: malloc (vg_replace_malloc.c:207) ==13315== by 0x4072382: (within /usr/lib/librpm-4.6.so) ==13315== by 0x407257B: (within /usr/lib/librpm-4.6.so) ==13315== by 0x40744B9: rpmSetTables (in /usr/lib/librpm-4.6.so) ==13315== by 0x40747BF: (within /usr/lib/librpm-4.6.so) ==13315== by 0x4074F5E: rpmReadConfigFiles (in /usr/lib/librpm-4.6.so) ==13315== by 0x804B341: executeTransactionUsingRpm (rpmutform.c:1682) ==13315== by 0x80493DB: main (callRpmUtil.c:16)
This is again rpmrc stuff, see above.
==13315== 22 bytes in 1 blocks are still reachable in loss record 6 of 54 ==13315== at 0x402A06E: malloc (vg_replace_malloc.c:207) ==13315== by 0x407E592: rpmtsAcquireLock (in /usr/lib/librpm-4.6.so) ==13315== by 0x407B54B: rpmtsRun (in /usr/lib/librpm-4.6.so) ==13315== by 0x804AE32: invokeRpmToRunTrans (rpmutform.c:1475) ==13315== by 0x804B73B: executeTransactionUsingRpm (rpmutform.c:1812) ==13315== by 0x80493DB: main (callRpmUtil.c:16)
This is deliberate one-shot initialization (and alloc).
==13315== ==13315== ==13315== 24 bytes in 1 blocks are still reachable in loss record 7 of 54 ==13315== at 0x402A06E: malloc (vg_replace_malloc.c:207) ==13315== by 0x40B6119: (within /usr/lib/librpmio-4.6.so) ==13315== by 0x40B62A1: rpmlog (in /usr/lib/librpmio-4.6.so) ==13315== by 0x406126C: rpmReadPackageFile (in /usr/lib/librpm-4.6.so) ==13315== by 0x8049AC1: addInstallPkgToRpmTs (rpmutform.c:369) ==13315== by 0x8049D93: addPkgForInstall (rpmutform.c:463) ==13315== by 0x804A10B: processTransList (rpmutform.c:630) ==13315== by 0x804B638: executeTransactionUsingRpm (rpmutform.c:1776) ==13315== by 0x80493DB: main (callRpmUtil.c:16)
Call rpmlogClose() before exit.
==13315== 24 bytes in 1 blocks are still reachable in loss record 9 of 54 ==13315== at 0x4028122: calloc (vg_replace_malloc.c:397) ==13315== by 0x40B6B76: rpmluaNew (in /usr/lib/librpmio-4.6.so) ==13315== by 0x40B72CA: rpmluaGetPrintBuffer (in /usr/lib/librpmio-4.6.so) ==13315== by 0x4074FA6: rpmReadConfigFiles (in /usr/lib/librpm-4.6.so) ==13315== by 0x804B341: executeTransactionUsingRpm (rpmutform.c:1682) ==13315== by 0x80493DB: main (callRpmUtil.c:16)
Another one-shot initialization, but rpm >= 4.7.0 the lua subsystem is shutdown too, eliminating this.
==13315== 32 bytes in 1 blocks are still reachable in loss record 12 of 54 ==13315== at 0x4028122: calloc (vg_replace_malloc.c:397) ==13315== by 0x40593A5: (within /usr/lib/librpm-4.6.so) ==13315== by 0x405941E: rpmGetFilesystemList (in /usr/lib/librpm-4.6.so) ==13315== by 0x4077B57: rpmtsInitDSI (in /usr/lib/librpm-4.6.so) ==13315== by 0x407B714: rpmtsRun (in /usr/lib/librpm-4.6.so) ==13315== by 0x804AE32: invokeRpmToRunTrans (rpmutform.c:1475) ==13315== by 0x804B6A8: executeTransactionUsingRpm (rpmutform.c:1793) ==13315== by 0x80493DB: main (callRpmUtil.c:16)
Call rpmFreeFileSystems() before exit.
==13315== 42 bytes in 1 blocks are still reachable in loss record 14 of 54 ==13315== at 0x402A06E: malloc (vg_replace_malloc.c:207) ==13315== by 0x406A8A9: rpmdsNewDNEVR (in /usr/lib/librpm-4.6.so) ==13315== by 0x406A9F2: rpmdsNext (in /usr/lib/librpm-4.6.so) ==13315== by 0x406ABD1: rpmdsSearch (in /usr/lib/librpm-4.6.so) ==13315== by 0x4056184: (within /usr/lib/librpm-4.6.so) ==13315== by 0x405654F: (within /usr/lib/librpm-4.6.so) ==13315== by 0x40568AA: rpmtsCheck (in /usr/lib/librpm-4.6.so) ==13315== by 0x804ACE6: invokeRpmToRunTrans (rpmutform.c:1422) ==13315== by 0x804B6A8: executeTransactionUsingRpm (rpmutform.c:1793) ==13315== by 0x80493DB: main (callRpmUtil.c:16) ==13315== ==13315== ==13315== 48 bytes in 1 blocks are still reachable in loss record 15 of 54 ==13315== at 0x402A06E: malloc (vg_replace_malloc.c:207) ==13315== by 0x406AFE9: rpmdsMerge (in /usr/lib/librpm-4.6.so) ==13315== by 0x406B76F: rpmdsRpmlib (in /usr/lib/librpm-4.6.so) ==13315== by 0x4056162: (within /usr/lib/librpm-4.6.so) ==13315== by 0x405654F: (within /usr/lib/librpm-4.6.so) ==13315== by 0x40568AA: rpmtsCheck (in /usr/lib/librpm-4.6.so) ==13315== by 0x804ACE6: invokeRpmToRunTrans (rpmutform.c:1422) ==13315== by 0x804B6A8: executeTransactionUsingRpm (rpmutform.c:1793) ==13315== by 0x80493DB: main (callRpmUtil.c:16)
This is from rpmlib() dependency set which is another one-shot initialization, freeing it is more fuss than worth.
[...bunch of dupes snipped...]
==13315== 1,256 bytes in 2 blocks are still reachable in loss record 43 of 54 ==13315== at 0x4028122: calloc (vg_replace_malloc.c:397) ==13315== by 0x405239F: (within /usr/lib/librpm-4.6.so) ==13315== by 0x4052839: (within /usr/lib/librpm-4.6.so) ==13315== by 0x4052344: rpmTagGetValue (in /usr/lib/librpm-4.6.so) ==13315== by 0x404C51A: (within /usr/lib/librpm-4.6.so) ==13315== by 0x404DBBE: (within /usr/lib/librpm-4.6.so) ==13315== by 0x404DEFB: rpmdbOpen (in /usr/lib/librpm-4.6.so) ==13315== by 0x40771AF: rpmtsOpenDB (in /usr/lib/librpm-4.6.so) ==13315== by 0x407724A: rpmtsInitIterator (in /usr/lib/librpm-4.6.so) ==13315== by 0x4077573: (within /usr/lib/librpm-4.6.so) ==13315== by 0x4077710: rpmtsGetKeyring (in /usr/lib/librpm-4.6.so) ==13315== by 0x40610FE: rpmReadPackageFile (in /usr/lib/librpm-4.6.so) ==13315==
This is rpm tag table stuff, another "static" item using one-shot allocation.
==13315== 21,792 bytes in 506 blocks are still reachable in loss record 53 of 54 ==13315== at 0x402A06E: malloc (vg_replace_malloc.c:207) ==13315== by 0x402A1EF: realloc (vg_replace_malloc.c:429) ==13315== by 0x405F853: (within /usr/lib/librpm-4.6.so) ==13315== by 0x405B425: (within /usr/lib/librpm-4.6.so) ==13315== by 0x405AAF1: (within /usr/lib/librpm-4.6.so) ==13315== by 0x405EFF2: fsmSetup (in /usr/lib/librpm-4.6.so) ==13315== by 0x4063872: (within /usr/lib/librpm-4.6.so) ==13315== by 0x4064B0B: (within /usr/lib/librpm-4.6.so) ==13315== by 0x4064311: (within /usr/lib/librpm-4.6.so) ==13315== by 0x407D5A3: rpmtsRun (in /usr/lib/librpm-4.6.so) ==13315== by 0x804AE32: invokeRpmToRunTrans (rpmutform.c:1475) ==13315== by 0x804B73B: executeTransactionUsingRpm (rpmutform.c:1812)
Hard to say for sure as there are no debugging symbols for librpm. Could be SELinux related (maybe rpm 4.6.0 isn't shutting down selinux properly, don't remember for sure).
Mind you there certainly are leaks in 4.6.0 (on various rarely used error paths typically), known ones are fixed in 4.7.0 and 4.6.x branch in git already.
- Panu - _______________________________________________ Rpm-list mailing list Rpm-list@xxxxxxxxxxxxx http://lists.rpm.org/mailman/listinfo/rpm-list