VirtualBox

Changeset 28412 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Apr 16, 2010 12:49:03 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
60176
Message:

LsiLogic: Fix memory leak

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp

    r28381 r28412  
    578578    PDMCritSectLeave(&pLsiLogic->ReplyPostQueueCritSect);
    579579}
     580
     581static void lsilogicTaskStateClear(PLSILOGICTASKSTATE pTaskState)
     582{
     583    RTMemFree(pTaskState->pSGListHead);
     584    RTMemFree(pTaskState->paSGEntries);
     585    if (pTaskState->pvBufferUnaligned)
     586        RTMemPageFree(pTaskState->pvBufferUnaligned, pTaskState->cbBufferUnaligned);
     587    pTaskState->cSGListSize = 0;
     588    pTaskState->cSGInfoSize = 0;
     589    pTaskState->cSGInfoEntries = 0;
     590    pTaskState->cSGListTooBig  = 0;
     591    pTaskState->pSGListHead = NULL;
     592    pTaskState->paSGEntries = NULL;
     593    pTaskState->pvBufferUnaligned = NULL;
     594    pTaskState->cbBufferUnaligned = 0;
     595}
     596
     597static int lsilogicTaskStateCtor(RTMEMCACHE hMemCache, void *pvObj, void *pvUser)
     598{
     599    memset(pvObj, 0, sizeof(LSILOGICTASKSTATE));
     600    return VINF_SUCCESS;
     601}
     602
     603static void lsilogicTaskStateDtor(RTMEMCACHE hMemCache, void *pvObj, void *pvUser)
     604{
     605    PLSILOGICTASKSTATE pTaskState = (PLSILOGICTASKSTATE)pvObj;
     606    lsilogicTaskStateClear(pTaskState);
     607}
     608
    580609#endif /* IN_RING3 */
    581610
     
    14831512    /* Free allocated memory if the list was too big too many times. */
    14841513    if (pTaskState->cSGListTooBig >= LSILOGIC_NR_OF_ALLOWED_BIGGER_LISTS)
    1485     {
    1486         RTMemFree(pTaskState->pSGListHead);
    1487         RTMemFree(pTaskState->paSGEntries);
    1488         if (pTaskState->pvBufferUnaligned)
    1489             RTMemPageFree(pTaskState->pvBufferUnaligned, pTaskState->cbBufferUnaligned);
    1490         pTaskState->cSGListSize = 0;
    1491         pTaskState->cSGInfoSize = 0;
    1492         pTaskState->cSGInfoEntries = 0;
    1493         pTaskState->cSGListTooBig  = 0;
    1494         pTaskState->pSGListHead = NULL;
    1495         pTaskState->paSGEntries = NULL;
    1496         pTaskState->pvBufferUnaligned = NULL;
    1497         pTaskState->cbBufferUnaligned = 0;
    1498     }
     1514        lsilogicTaskStateClear(pTaskState);
    14991515}
    15001516
     
    45554571     */
    45564572    rc = RTMemCacheCreate(&pThis->hTaskCache, sizeof(LSILOGICTASKSTATE), 0, UINT32_MAX,
    4557                           NULL, NULL, NULL, 0);
     4573                          lsilogicTaskStateCtor, lsilogicTaskStateDtor, NULL, 0);
    45584574    if (RT_FAILURE(rc))
    45594575        return PDMDEV_SET_ERROR(pDevIns, rc,
Note: See TracChangeset for help on using the changeset viewer.

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