[libvirt] [PATCH] plug two leaks

Jim Meyering jim at meyering.net
Fri May 16 16:57:25 UTC 2008


"Daniel P. Berrange" <berrange at redhat.com> wrote:
> On Fri, May 16, 2008 at 06:44:48PM +0200, Jim Meyering wrote:
>> Running "make check" under valgrind exposed at least
>> the first.  Then, I spotted the other.
>
> ACK.

speedy ;-)
Committed.

Actually there's one more, but I don't have time for it right now:

     128 (96 direct, 32 indirect) bytes in 6 blocks are definitely lost in loss record 5 of 7
        at 0x4A05174: calloc (vg_replace_malloc.c:397)
        by 0x40A6EA: qemudParseVMDef (qemu_conf.c:2078)
        by 0x402991: testCompareXMLToArgvHelper (qemuxml2argvtest.c:43)
        by 0x4032C0: virtTestRun (testutils.c:79)
        by 0x402861: main (qemuxml2argvtest.c:180)

It's allocated with this calloc call:

    /* Parse sound driver xml */
    obj = xmlXPathEval(BAD_CAST "/domain/devices/sound", ctxt);
    if ((obj != NULL) && (obj->type == XPATH_NODESET) &&
        (obj->nodesetval != NULL) && (obj->nodesetval->nodeNr >= 0)) {
        struct qemud_vm_sound_def *prev = NULL;
        for (i = 0; i < obj->nodesetval->nodeNr; i++) {

            struct qemud_vm_sound_def *sound = calloc(1, sizeof(*sound));
            struct qemud_vm_sound_def *check = def->sounds;
            int collision = 0;
            if (!sound) {
                qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
                         "%s", _("failed to allocate space for sound dev"));
                goto error;
            }
            if (qemudParseSoundXML(conn, sound,
                                   obj->nodesetval->nodeTab[i]) < 0) {
                free(sound);
                goto error;
            }

            // Check that model type isn't already present in sound dev list
            while(check) {
                if (check->model == sound->model) {
                    collision = 1;
                    break;
                }
                check = check->next;
            }
            if (collision)
                continue;

            def->nsounds++;
            sound->next = NULL;
            if (def->sounds == NULL) {
                def->sounds = sound;
            } else {
                prev->next = sound;
            }
            prev = sound;
        }
    }




More information about the libvir-list mailing list