VirtualBox

Changeset 13295 in vbox for trunk/src/VBox/Devices/Storage


Ignore:
Timestamp:
Oct 15, 2008 6:07:59 PM (16 years ago)
Author:
vboxsync
Message:

#3230: Fixed memory leaks in VMDK, tstVD and VBoxHDD-new.

Location:
trunk/src/VBox/Devices/Storage
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Storage/VBoxHDD-new.cpp

    r12774 r13295  
    19681968            vdRemoveImageFromList(pDisk, pImg);
    19691969            pImg->Backend->pfnClose(pImg->pvBackendData, true);
     1970            RTMemFree(pImg->pszFilename);
     1971            RTMemFree(pImg);
    19701972            pImg = pTmp;
    19711973        }
  • trunk/src/VBox/Devices/Storage/VmdkHDDCore.cpp

    r13268 r13295  
    890890
    891891        /** @todo figure out what to do for unclean VMDKs. */
     892        RTMemTmpFree(pTmpGT1);
     893        RTMemTmpFree(pTmpGT2);
    892894    }
    893895
     
    29792981        if (RT_FAILURE(rc))
    29802982            return vmdkError(pImage, rc, RT_SRC_POS, N_("VMDK: could not create new sparse descriptor file '%s'"), pImage->pszFilename);
    2981         pImage->pszFilename = RTStrDup(pImage->pszFilename);
     2983        // @todo Is there any sense in the following line I've commented out?
     2984        //pImage->pszFilename = RTStrDup(pImage->pszFilename);
    29822985    }
    29832986    else
     
    33983401        vmdkFileClose(pImage, &pImage->pFile, fDelete);
    33993402    vmdkFileCheckAllClose(pImage);
     3403    if (pImage->pGTCache)
     3404    {
     3405        RTMemFree(pImage->pGTCache);
     3406        pImage->pGTCache = NULL;
     3407    }
     3408    if (pImage->pDescData)
     3409    {
     3410        RTMemFree(pImage->pDescData);
     3411        pImage->pDescData = NULL;
     3412    }
    34003413}
    34013414
     
    37663779    rc = vmdkOpenImage(pImage, VD_OPEN_FLAGS_INFO | VD_OPEN_FLAGS_READONLY);
    37673780    vmdkFreeImage(pImage, false);
     3781    RTMemFree(pImage);
    37683782
    37693783out:
     
    39073921        }
    39083922        *ppBackendData = pImage;
     3923    }
     3924    else
     3925    {
     3926        RTMemFree(pImage->pDescData);
     3927        RTMemFree(pImage);
    39093928    }
    39103929
     
    41324151        }
    41334152        else
     4153        {   
     4154            /* Shouldn't be null for separate descriptor.
     4155             * There will be no access to the actual content.
     4156             */
     4157            pImage->pDescData = pszOldDescName;
    41344158            pImage->pFile = pFile;
     4159        }
    41354160        pImage->Descriptor = DescriptorCopy;
    41364161        vmdkWriteDescriptor(pImage);
     
    41394164        pImage->pExtents = NULL;
    41404165        pImage->pFile = NULL;
     4166        pImage->pDescData = NULL;
    41414167        /* Re-open the image back. */
    41424168        pImage->pszFilename = pszOldImageName;
     
    41944220     * not signalled as an error. After all nothing bad happens. */
    41954221    if (pImage)
     4222    {
    41964223        vmdkFreeImage(pImage, fDelete);
     4224        RTMemFree(pImage);
     4225    }
    41974226
    41984227    LogFlowFunc(("returns %Rrc\n", rc));
  • trunk/src/VBox/Devices/Storage/testcase/tstVD.cpp

    r13268 r13295  
    3232#include "stdlib.h"
    3333
     34#define VHD_TEST
     35#define VDI_TEST
     36#define VMDK_TEST
     37
    3438/*******************************************************************************
    3539*   Global Variables                                                           *
     
    6771        if (VBOX_FAILURE(rc)) \
    6872        { \
    69             VDCloseAll(pVD); \
     73            VDDestroy(pVD); \
    7074            return rc; \
    7175        } \
     
    103107    }
    104108
     109    VDDestroy(pVD);
    105110#undef CHECK
    106111    return 0;
     
    123128        if (VBOX_FAILURE(rc)) \
    124129        { \
    125             VDCloseAll(pVD); \
     130            VDDestroy(pVD); \
    126131            return rc; \
    127132        } \
     
    154159    }
    155160
     161    VDDestroy(pVD);
    156162#undef CHECK
    157163    return 0;
     
    505511        if (VBOX_FAILURE(rc)) \
    506512        { \
    507             VDCloseAll(pVD); \
     513            if (pvBuf) \
     514                RTMemFree(pvBuf); \
     515            VDDestroy(pVD); \
    508516            return rc; \
    509517        } \
    510518    } while (0)
     519
     520    void *pvBuf = RTMemAlloc(_1M);
    511521
    512522    /* Create error interface. */
     
    558568    PSEGMENT paMergeSegments = (PSEGMENT)RTMemAllocZ(sizeof(struct Segment) * (nSegments + 1) * 3);
    559569
    560     void *pvBuf = RTMemAlloc(_1M);
    561 
    562570    RNDCTX ctx;
    563571    initializeRandomGenerator(&ctx, u32Seed);
     
    600608    VDDumpImages(pVD);
    601609
    602     VDCloseAll(pVD);
     610    VDDestroy(pVD);
     611    if (pvBuf)
     612        RTMemFree(pvBuf);
    603613#undef CHECK
    604614    return 0;
     
    625635        if (VBOX_FAILURE(rc)) \
    626636        { \
    627             VDCloseAll(pVD); \
     637            VDDestroy(pVD); \
    628638            return rc; \
    629639        } \
     
    681691    RTMemFree(paSegments);
    682692
    683     VDCloseAll(pVD);
     693    VDDestroy(pVD);
    684694#undef CHECK
    685695    return 0;
     
    700710        if (VBOX_FAILURE(rc)) \
    701711        { \
    702             VDCloseAll(pVD); \
     712            VDDestroy(pVD); \
    703713            return rc; \
    704714        } \
     
    722732    CHECK("VDCopy()");
    723733
    724     VDCloseAll(pVD);
     734    VDDestroy(pVD);
    725735#undef CHECK
    726736    return 0;
     
    884894    }
    885895
     896#ifdef VMDK_TEST
    886897    rc = tstVDCreateDelete("VMDK", "tmpVDCreate.vmdk", 2 * _4G,
    887898                           VD_IMAGE_TYPE_NORMAL, VD_IMAGE_FLAGS_NONE,
     
    906917        g_cErrors++;
    907918    }
    908 #if 1
     919
    909920    tstVmdk();
    910 #endif
    911 #if 1
     921#endif /* VMDK_TEST */
     922#ifdef VDI_TEST
    912923    rc = tstVDCreateDelete("VDI", "tmpVDCreate.vdi", 2 * _4G,
    913924                           VD_IMAGE_TYPE_NORMAL, VD_IMAGE_FLAGS_NONE,
     
    926937        g_cErrors++;
    927938    }
    928 #endif
     939#endif /* VDI_TEST */
     940#ifdef VMDK_TEST
    929941    rc = tstVDCreateDelete("VMDK", "tmpVDCreate.vmdk", 2 * _4G,
    930942                           VD_IMAGE_TYPE_NORMAL, VD_IMAGE_FLAGS_NONE,
     
    959971        g_cErrors++;
    960972    }
    961 #if 1
     973#endif /* VMDK_TEST */
     974#ifdef VHD_TEST
    962975    rc = tstVDCreateDelete("VHD", "tmpVDCreate.vhd", 2 * _4G,
    963976                           VD_IMAGE_TYPE_NORMAL, VD_IMAGE_FLAGS_NONE,
     
    976989        g_cErrors++;
    977990    }
    978 
     991#endif /* VHD_TEST */
     992#ifdef VDI_TEST
    979993    rc = tstVDOpenCreateWriteMerge("VDI", "tmpVDBase.vdi", "tmpVDDiff.vdi", u32Seed);
    980994    if (VBOX_FAILURE(rc))
     
    9891003        g_cErrors++;
    9901004    }
     1005#endif /* VDI_TEST */
     1006#ifdef VMDK_TEST
    9911007    rc = tstVDOpenCreateWriteMerge("VMDK", "tmpVDBase.vmdk", "tmpVDDiff.vmdk", u32Seed);
    9921008    if (VBOX_FAILURE(rc))
     
    10011017        g_cErrors++;
    10021018    }
    1003 
     1019#endif /* VMDK_TEST */
     1020#ifdef VHD_TEST
    10041021    rc = tstVDCreateWriteOpenRead("VHD", "tmpVDCreate.vhd", u32Seed);
    10051022    if (VBOX_FAILURE(rc))
     
    10151032        g_cErrors++;
    10161033    }
    1017 #endif
     1034#endif /* VHD_TEST */
    10181035
    10191036    /*
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette