VirtualBox

Changeset 91687 in vbox


Ignore:
Timestamp:
Oct 12, 2021 10:26:53 AM (3 years ago)
Author:
vboxsync
Message:

Audio: Fixed a small memory leak (driver description) in the driver attach logic of the HDA emulation and matched it to AC'97 and SB16. ​bugref:10008

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Audio/DevHda.cpp

    r90448 r91687  
    191191    HDADRIVERSTREAM                    Rear;
    192192#endif
     193    /** The LUN description. */
     194    char                               szDesc[48 - 2];
    193195} HDADRIVER;
    194196/** The HDA host driver backend. */
     
    45264528static int hdaR3AttachInternal(PPDMDEVINS pDevIns, PHDASTATE pThis, PHDASTATER3 pThisCC, unsigned uLUN, PHDADRIVER *ppDrv)
    45274529{
    4528     /*
    4529      * Attach driver.
    4530      */
    4531     char *pszDesc = RTStrAPrintf2("Audio driver port (HDA) for LUN#%u", uLUN);
    4532     AssertLogRelReturn(pszDesc, VERR_NO_STR_MEMORY);
     4530    PHDADRIVER pDrv = (PHDADRIVER)RTMemAllocZ(sizeof(HDADRIVER));
     4531    AssertPtrReturn(pDrv, VERR_NO_MEMORY);
     4532    RTStrPrintf(pDrv->szDesc, sizeof(pDrv->szDesc), "Audio driver port (HDA) for LUN #%u", uLUN);
    45334533
    45344534    PPDMIBASE pDrvBase;
    4535     int rc = PDMDevHlpDriverAttach(pDevIns, uLUN, &pThisCC->IBase, &pDrvBase, pszDesc);
     4535    int rc = PDMDevHlpDriverAttach(pDevIns, uLUN, &pThisCC->IBase, &pDrvBase, pDrv->szDesc);
    45364536    if (RT_SUCCESS(rc))
    45374537    {
    4538         PHDADRIVER pDrv = (PHDADRIVER)RTMemAllocZ(sizeof(HDADRIVER));
    4539         if (pDrv)
    4540         {
    4541             pDrv->pConnector = PDMIBASE_QUERY_INTERFACE(pDrvBase, PDMIAUDIOCONNECTOR);
    4542             AssertPtr(pDrv->pConnector);
    4543             if (RT_VALID_PTR(pDrv->pConnector))
     4538        pDrv->pConnector = PDMIBASE_QUERY_INTERFACE(pDrvBase, PDMIAUDIOCONNECTOR);
     4539        AssertPtr(pDrv->pConnector);
     4540        if (RT_VALID_PTR(pDrv->pConnector))
     4541        {
     4542            pDrv->pDrvBase          = pDrvBase;
     4543            pDrv->pHDAStateShared   = pThis;
     4544            pDrv->pHDAStateR3       = pThisCC;
     4545            pDrv->uLUN              = uLUN;
     4546
     4547            /* Attach to driver list if not attached yet. */
     4548            if (!pDrv->fAttached)
    45444549            {
    4545                 pDrv->pDrvBase          = pDrvBase;
    4546                 pDrv->pHDAStateShared   = pThis;
    4547                 pDrv->pHDAStateR3       = pThisCC;
    4548                 pDrv->uLUN              = uLUN;
    4549 
    4550                 /* Attach to driver list if not attached yet. */
    4551                 if (!pDrv->fAttached)
    4552                 {
    4553                     RTListAppend(&pThisCC->lstDrv, &pDrv->Node);
    4554                     pDrv->fAttached = true;
    4555                 }
    4556 
    4557                 if (ppDrv)
    4558                     *ppDrv = pDrv;
    4559 
    4560                 /*
    4561                  * While we're here, give the windows backends a hint about our typical playback
    4562                  * configuration.
    4563                  * Note! If 48000Hz is advertised to the guest, add it here.
    4564                  */
    4565                 if (   pDrv->pConnector
    4566                     && pDrv->pConnector->pfnStreamConfigHint)
    4567                 {
    4568                     PDMAUDIOSTREAMCFG Cfg;
    4569                     RT_ZERO(Cfg);
    4570                     Cfg.enmDir                        = PDMAUDIODIR_OUT;
    4571                     Cfg.enmPath                       = PDMAUDIOPATH_OUT_FRONT;
    4572                     Cfg.Device.cMsSchedulingHint      = 10;
    4573                     Cfg.Backend.cFramesPreBuffering   = UINT32_MAX;
    4574                     PDMAudioPropsInit(&Cfg.Props, 2, true /*fSigned*/, 2, 44100);
    4575                     RTStrPrintf(Cfg.szName, sizeof(Cfg.szName), "output 44.1kHz 2ch S16 (HDA config hint)");
    4576 
    4577                     pDrv->pConnector->pfnStreamConfigHint(pDrv->pConnector, &Cfg); /* (may trash CfgReq) */
    4578                 }
    4579 
    4580                 LogFunc(("LUN#%u: returns VINF_SUCCESS (pCon=%p)\n", uLUN, pDrv->pConnector));
    4581                 return VINF_SUCCESS;
     4550                RTListAppend(&pThisCC->lstDrv, &pDrv->Node);
     4551                pDrv->fAttached = true;
    45824552            }
    45834553
    4584             rc = VERR_PDM_MISSING_INTERFACE_BELOW;
    4585         }
    4586         else
    4587             rc = VERR_NO_MEMORY;
     4554            if (ppDrv)
     4555                *ppDrv = pDrv;
     4556
     4557            /*
     4558             * While we're here, give the windows backends a hint about our typical playback
     4559             * configuration.
     4560             * Note! If 48000Hz is advertised to the guest, add it here.
     4561             */
     4562            if (   pDrv->pConnector
     4563                && pDrv->pConnector->pfnStreamConfigHint)
     4564            {
     4565                PDMAUDIOSTREAMCFG Cfg;
     4566                RT_ZERO(Cfg);
     4567                Cfg.enmDir                        = PDMAUDIODIR_OUT;
     4568                Cfg.enmPath                       = PDMAUDIOPATH_OUT_FRONT;
     4569                Cfg.Device.cMsSchedulingHint      = 10;
     4570                Cfg.Backend.cFramesPreBuffering   = UINT32_MAX;
     4571                PDMAudioPropsInit(&Cfg.Props, 2, true /*fSigned*/, 2, 44100);
     4572                RTStrPrintf(Cfg.szName, sizeof(Cfg.szName), "output 44.1kHz 2ch S16 (HDA config hint)");
     4573
     4574                pDrv->pConnector->pfnStreamConfigHint(pDrv->pConnector, &Cfg); /* (may trash CfgReq) */
     4575            }
     4576
     4577            LogFunc(("LUN#%u: returns VINF_SUCCESS (pCon=%p)\n", uLUN, pDrv->pConnector));
     4578            return VINF_SUCCESS;
     4579        }
     4580
     4581        rc = VERR_PDM_MISSING_INTERFACE_BELOW;
    45884582    }
    45894583    else if (rc == VERR_PDM_NO_ATTACHED_DRIVER)
     
    45914585    else
    45924586        LogFunc(("Failed attaching driver for LUN #%u: %Rrc\n", uLUN, rc));
    4593 
    4594     RTStrFree(pszDesc);
     4587    RTMemFree(pDrv);
     4588
    45954589    LogFunc(("LUN#%u: rc=%Rrc\n", uLUN, rc));
    45964590    return rc;
  • trunk/src/VBox/Devices/Audio/DevIchAc97.cpp

    r90447 r91687  
    515515    bool                            fAttached;
    516516    uint8_t                         abPadding[6];
    517     /** Pointer to the description string passed to PDMDevHlpDriverAttach(). */
    518     R3PTRTYPE(char *)               pszDesc;
    519517    /** Pointer to attached driver base interface. */
    520518    R3PTRTYPE(PPDMIBASE)            pDrvBase;
     
    527525    /** Driver stream for output. */
    528526    AC97DRIVERSTREAM                Out;
     527    /** The LUN description. */
     528    char                            szDesc[48 - 2];
    529529} AC97DRIVER;
    530530/** Pointer to a host backend driver (LUN). */
     
    41454145 * @param   pDevIns     The device instance.
    41464146 * @param   pThisCC     The ring-3 AC'97 device state.
    4147  * @param   iLun        The logical unit which is being attached.
     4147 * @param   uLUN        The logical unit which is being attached.
    41484148 * @param   ppDrv       Attached driver instance on success. Optional.
    41494149 */
    4150 static int ichac97R3AttachInternal(PPDMDEVINS pDevIns, PAC97STATER3 pThisCC, unsigned iLun, PAC97DRIVER *ppDrv)
     4150static int ichac97R3AttachInternal(PPDMDEVINS pDevIns, PAC97STATER3 pThisCC, unsigned uLUN, PAC97DRIVER *ppDrv)
    41514151{
    41524152    /*
    4153      * Attach driver.
     4153     * Allocate a new driver structure and try attach the driver.
    41544154     */
    4155     char *pszDesc = RTStrAPrintf2("Audio driver port (AC'97) for LUN #%u", iLun);
    4156     AssertLogRelReturn(pszDesc, VERR_NO_STR_MEMORY);
     4155    PAC97DRIVER pDrv = (PAC97DRIVER)RTMemAllocZ(sizeof(AC97DRIVER));
     4156    AssertPtrReturn(pDrv, VERR_NO_MEMORY);
     4157    RTStrPrintf(pDrv->szDesc, sizeof(pDrv->szDesc), "Audio driver port (AC'97) for LUN #%u", uLUN);
    41574158
    41584159    PPDMIBASE pDrvBase;
    4159     int rc = PDMDevHlpDriverAttach(pDevIns, iLun, &pThisCC->IBase, &pDrvBase, pszDesc);
     4160    int rc = PDMDevHlpDriverAttach(pDevIns, uLUN, &pThisCC->IBase, &pDrvBase, pDrv->szDesc);
    41604161    if (RT_SUCCESS(rc))
    41614162    {
    4162         PAC97DRIVER pDrv = (PAC97DRIVER)RTMemAllocZ(sizeof(AC97DRIVER));
    4163         if (pDrv)
     4163       pDrv->pConnector = PDMIBASE_QUERY_INTERFACE(pDrvBase, PDMIAUDIOCONNECTOR);
     4164        AssertPtr(pDrv->pConnector);
     4165        if (RT_VALID_PTR(pDrv->pConnector))
    41644166        {
    4165             pDrv->pConnector = PDMIBASE_QUERY_INTERFACE(pDrvBase, PDMIAUDIOCONNECTOR);
    4166             AssertPtr(pDrv->pConnector);
    4167             if (RT_VALID_PTR(pDrv->pConnector))
     4167            pDrv->pDrvBase   = pDrvBase;
     4168            pDrv->uLUN       = uLUN;
     4169
     4170            /* Attach to driver list if not attached yet. */
     4171            if (!pDrv->fAttached)
    41684172            {
    4169                 pDrv->pDrvBase   = pDrvBase;
    4170                 pDrv->uLUN       = iLun;
    4171                 pDrv->pszDesc    = pszDesc;
    4172 
    4173                 /* Attach to driver list if not attached yet. */
    4174                 if (!pDrv->fAttached)
    4175                 {
    4176                     RTListAppend(&pThisCC->lstDrv, &pDrv->Node);
    4177                     pDrv->fAttached = true;
    4178                 }
    4179 
    4180                 if (ppDrv)
    4181                     *ppDrv = pDrv;
    4182 
    4183                 /*
    4184                  * While we're here, give the windows backends a hint about our typical playback
    4185                  * configuration.
    4186                  */
    4187                 if (   pDrv->pConnector
    4188                     && pDrv->pConnector->pfnStreamConfigHint)
    4189                 {
    4190                     /* 48kHz */
    4191                     PDMAUDIOSTREAMCFG Cfg;
    4192                     RT_ZERO(Cfg);
    4193                     Cfg.enmDir                        = PDMAUDIODIR_OUT;
    4194                     Cfg.enmPath                       = PDMAUDIOPATH_OUT_FRONT;
    4195                     Cfg.Device.cMsSchedulingHint      = 5;
    4196                     Cfg.Backend.cFramesPreBuffering   = UINT32_MAX;
    4197                     PDMAudioPropsInit(&Cfg.Props, 2, true /*fSigned*/, 2, 48000);
    4198                     RTStrPrintf(Cfg.szName, sizeof(Cfg.szName), "output 48kHz 2ch S16 (HDA config hint)");
    4199 
    4200                     pDrv->pConnector->pfnStreamConfigHint(pDrv->pConnector, &Cfg); /* (may trash CfgReq) */
     4173                RTListAppend(&pThisCC->lstDrv, &pDrv->Node);
     4174                pDrv->fAttached = true;
     4175            }
     4176
     4177            if (ppDrv)
     4178                *ppDrv = pDrv;
     4179
     4180            /*
     4181             * While we're here, give the windows backends a hint about our typical playback
     4182             * configuration.
     4183             */
     4184            if (   pDrv->pConnector
     4185                && pDrv->pConnector->pfnStreamConfigHint)
     4186            {
     4187                /* 48kHz */
     4188                PDMAUDIOSTREAMCFG Cfg;
     4189                RT_ZERO(Cfg);
     4190                Cfg.enmDir                        = PDMAUDIODIR_OUT;
     4191                Cfg.enmPath                       = PDMAUDIOPATH_OUT_FRONT;
     4192                Cfg.Device.cMsSchedulingHint      = 5;
     4193                Cfg.Backend.cFramesPreBuffering   = UINT32_MAX;
     4194                PDMAudioPropsInit(&Cfg.Props, 2, true /*fSigned*/, 2, 48000);
     4195                RTStrPrintf(Cfg.szName, sizeof(Cfg.szName), "output 48kHz 2ch S16 (HDA config hint)");
     4196
     4197                pDrv->pConnector->pfnStreamConfigHint(pDrv->pConnector, &Cfg); /* (may trash CfgReq) */
    42014198# if 0
    4202                     /* 44.1kHz */
    4203                     RT_ZERO(Cfg);
    4204                     Cfg.enmDir                        = PDMAUDIODIR_OUT;
    4205                     Cfg.enmPath                       = PDMAUDIOPATH_OUT_FRONT;
    4206                     Cfg.Device.cMsSchedulingHint      = 10;
    4207                     Cfg.Backend.cFramesPreBuffering   = UINT32_MAX;
    4208                     PDMAudioPropsInit(&Cfg.Props, 2, true /*fSigned*/, 2, 44100);
    4209                     RTStrPrintf(Cfg.szName, sizeof(Cfg.szName), "output 44.1kHz 2ch S16 (HDA config hint)");
    4210 
    4211                     pDrv->pConnector->pfnStreamConfigHint(pDrv->pConnector, &Cfg); /* (may trash CfgReq) */
     4199                /* 44.1kHz */
     4200                RT_ZERO(Cfg);
     4201                Cfg.enmDir                        = PDMAUDIODIR_OUT;
     4202                Cfg.enmPath                       = PDMAUDIOPATH_OUT_FRONT;
     4203                Cfg.Device.cMsSchedulingHint      = 10;
     4204                Cfg.Backend.cFramesPreBuffering   = UINT32_MAX;
     4205                PDMAudioPropsInit(&Cfg.Props, 2, true /*fSigned*/, 2, 44100);
     4206                RTStrPrintf(Cfg.szName, sizeof(Cfg.szName), "output 44.1kHz 2ch S16 (HDA config hint)");
     4207
     4208                pDrv->pConnector->pfnStreamConfigHint(pDrv->pConnector, &Cfg); /* (may trash CfgReq) */
    42124209# endif
    4213                 }
    4214 
    4215                 LogFunc(("LUN#%u: returns VINF_SUCCESS (pCon=%p)\n", iLun, pDrv->pConnector));
    4216                 return VINF_SUCCESS;
    42174210            }
    4218             RTMemFree(pDrv);
    4219             rc = VERR_PDM_MISSING_INTERFACE_BELOW;
     4211
     4212            LogFunc(("LUN#%u: returns VINF_SUCCESS (pCon=%p)\n", uLUN, pDrv->pConnector));
     4213            return VINF_SUCCESS;
    42204214        }
    4221         else
    4222             rc = VERR_NO_MEMORY;
     4215        RTMemFree(pDrv);
     4216        rc = VERR_PDM_MISSING_INTERFACE_BELOW;
    42234217    }
    42244218    else if (rc == VERR_PDM_NO_ATTACHED_DRIVER)
    4225         LogFunc(("No attached driver for LUN #%u\n", iLun));
     4219        LogFunc(("No attached driver for LUN #%u\n", uLUN));
    42264220    else
    4227         LogFunc(("Attached driver for LUN #%u failed: %Rrc\n", iLun, rc));
    4228 
    4229     RTStrFree(pszDesc);
    4230     LogFunc(("LUN#%u: rc=%Rrc\n", iLun, rc));
     4221        LogFunc(("Attached driver for LUN #%u failed: %Rrc\n", uLUN, rc));
     4222    RTMemFree(pDrv);
     4223
     4224    LogFunc(("LUN#%u: rc=%Rrc\n", uLUN, rc));
    42314225    return rc;
    42324226}
     
    43224316            DEVAC97_UNLOCK(pDevIns, pThis);
    43234317
    4324             RTStrFree(pDrv->pszDesc);
    43254318            RTMemFree(pDrv);
    43264319            return;
     
    43474340    {
    43484341        RTListNodeRemove(&pDrv->Node);
    4349         RTMemFree(pDrv->pszDesc);
    43504342        RTMemFree(pDrv);
    43514343    }
  • trunk/src/VBox/Devices/Audio/DevSB16.cpp

    r90016 r91687  
    26302630     */
    26312631    PSB16DRIVER pDrv = (PSB16DRIVER)RTMemAllocZ(sizeof(SB16DRIVER));
    2632     AssertReturn(pDrv, VERR_NO_MEMORY);
     2632    AssertPtrReturn(pDrv, VERR_NO_MEMORY);
    26332633    RTStrPrintf(pDrv->szDesc, sizeof(pDrv->szDesc), "Audio driver port (SB16) for LUN #%u", uLUN);
    26342634
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