diff --git a/modules/services_discovery/upnp.cpp b/modules/services_discovery/upnp.cpp index a6993e18542db5cf68078e5e7356f73f7bd570e7..044ccc17890a711e886c6411fc9c2507f2a63097 100644 --- a/modules/services_discovery/upnp.cpp +++ b/modules/services_discovery/upnp.cpp @@ -1619,32 +1619,18 @@ void *SearchThread(void *data) } static int OpenRD( vlc_object_t *p_this ) +try { vlc_renderer_discovery_t *p_rd = ( vlc_renderer_discovery_t* )p_this; - renderer_discovery_sys_t *p_sys = new(std::nothrow) renderer_discovery_sys_t; + auto p_sys = std::make_unique<renderer_discovery_sys_t>(); - if ( !p_sys ) - return VLC_ENOMEM; - p_rd->p_sys = p_sys; + p_rd->p_sys = p_sys.get(); p_sys->p_upnp = UpnpInstanceWrapper::get( p_this ); if ( !p_sys->p_upnp ) - { - delete p_sys; return VLC_EGENERIC; - } - try - { - p_sys->p_renderer_list = std::make_shared<RD::MediaRendererList>( p_rd ); - } - catch ( const std::bad_alloc& ) - { - msg_Err( p_rd, "Failed to create a MediaRendererList"); - p_sys->p_upnp->release(); - free(p_sys); - return VLC_EGENERIC; - } + p_sys->p_renderer_list = std::make_shared<RD::MediaRendererList>( p_rd ); p_sys->p_upnp->addListener( p_sys->p_renderer_list ); if( vlc_clone( &p_sys->thread, SearchThread, (void*)p_rd, @@ -1653,11 +1639,22 @@ static int OpenRD( vlc_object_t *p_this ) msg_Err( p_rd, "Can't run the lookup thread" ); p_sys->p_upnp->removeListener( p_sys->p_renderer_list ); p_sys->p_upnp->release(); - delete p_sys; return VLC_EGENERIC; } + + /* Release ownership of std::unique_ptr */ + p_sys.release(); + return VLC_SUCCESS; } +catch ( const std::bad_alloc& ) +{ + vlc_renderer_discovery_t *p_rd = (vlc_renderer_discovery_t*)p_this; + renderer_discovery_sys_t *p_sys = static_cast<renderer_discovery_sys_t *>(p_rd->p_sys); + if (p_sys && p_sys->p_upnp) + p_sys->p_upnp->release(); + return VLC_ENOMEM; +} static void CloseRD( vlc_object_t *p_this ) {