[vlc-devel] [PATCH] input: decoder: fix NULL deref on early cancellation
Thomas Guillem
thomas at gllm.fr
Tue Mar 10 08:44:16 CET 2020
On Tue, Mar 10, 2020, at 08:01, Steve Lhomme wrote:
> The patch won't hurt but I also wonder how it's possible to end up in
I don't like this reasoning, the variables state of input/decoder.c need to be clearly defined.
> this situation.
Easy, Kill the decoder with an asynchronous decoder.
DeleteDecoder() will first destroy the out_pool, then the module will be unloaded.
So, nothing prevent the module to request a picture from an asynchronous thread between the out_pool destroy and the module unloading.
Since ModuleThread_NewVideoBuffer() is called without a lock, this patch is wrong.
The proposed solution is to first unload the module, then destroy the out_pool from DeleteDecoder().
>
> The decoder thread is not canceled as far as I can see in decoder.c. So
> that means the ModuleThread in this case is an internal thread of the
> decoder (likely lavc). If it's canceled it should prevent other threads
> trying to continue using the decoder after that. In this case the
> "decoder" object is a resource that should be protected from multiple
> thread accesses at the same time.
>
> So maybe this fix (if it actually happened) is hiding a different problem.
>
> On 2020-03-10 7:49, Thomas Guillem wrote:
> >
> >
> > On Mon, Mar 9, 2020, at 22:50, Francois Cartegnie wrote:
> >> ---
> >> src/input/decoder.c | 3 ++-
> >> 1 file changed, 2 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/src/input/decoder.c b/src/input/decoder.c
> >> index d868c21f23..998a2816bb 100644
> >> --- a/src/input/decoder.c
> >> +++ b/src/input/decoder.c
> >> @@ -650,7 +650,8 @@ static picture_t *ModuleThread_NewVideoBuffer(
> >> decoder_t *p_dec )
> >> {
> >> struct decoder_owner *p_owner = dec_get_owner( p_dec );
> >> assert( p_owner->p_vout );
> >> -
> >> + if( p_owner->out_pool == NULL )
> >> + return NULL;
> >
> >
> > The big question is : why is the out_pool destroyed before the decoder module in DeleteDecoder ?
>
> It makes sense to remove the pictures allocated by the decoder before
> the decoder module is gone and possibly DLLs not accessible anymore to
> do it (DVXA.DLL for example).
>
> In practice this pool is a shadow of the actual surfaces allocated by
> the decoder in GPU decoding. It may not hold any "context" at this
> point. It depends if some pictures are in-flight (sent by the decoder to
> be used) or not. In CPU decoding it's not an issue. This pool could also
> go away if each decoder managed its pool but that is not the case yet.
>
> > So that every future decoder_NewPicture fails ? In that case, this patch is OK for me.
> >
> > Steve ?
> >
> >> picture_t *pic = picture_pool_Wait( p_owner->out_pool );
> >> if (pic)
> >> picture_Reset( pic );
> >> --
> >> 2.24.1
> >>
> >> _______________________________________________
> >> vlc-devel mailing list
> >> To unsubscribe or modify your subscription options:
> >> https://mailman.videolan.org/listinfo/vlc-devel
> > _______________________________________________
> > vlc-devel mailing list
> > To unsubscribe or modify your subscription options:
> > https://mailman.videolan.org/listinfo/vlc-devel
> >
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list