[FFmpeg-devel] [PATCH] avutil/hwcontext_vaapi: fix SEGV in vaTerminate when vaInitialize fails

Mark Thompson sw at jkqxz.net
Fri Feb 3 22:19:11 EET 2017


On 03/02/17 05:45, wm4 wrote:
> On Thu,  2 Feb 2017 09:29:13 -0800
> Aman Gupta <ffmpeg at tmm1.net> wrote:
> 
>> From: Aman Gupta <aman at tmm1.net>
>>
>> Program terminated with signal SIGSEGV, Segmentation fault.
>>     opts=opts at entry=0x0, flags=flags at entry=0) at libavutil/hwcontext.c:494
>> ---
>>  libavutil/hwcontext_vaapi.c | 3 +--
>>  1 file changed, 1 insertion(+), 2 deletions(-)
>>
>> diff --git a/libavutil/hwcontext_vaapi.c b/libavutil/hwcontext_vaapi.c
>> index 6176bdc..0051acb 100644
>> --- a/libavutil/hwcontext_vaapi.c
>> +++ b/libavutil/hwcontext_vaapi.c
>> @@ -961,14 +961,13 @@ static int vaapi_device_create(AVHWDeviceContext *ctx, const char *device,
>>          return AVERROR(EINVAL);
>>      }
>>  
>> -    hwctx->display = display;
>> -
>>      vas = vaInitialize(display, &major, &minor);
>>      if (vas != VA_STATUS_SUCCESS) {
>>          av_log(ctx, AV_LOG_ERROR, "Failed to initialise VAAPI "
>>                 "connection: %d (%s).\n", vas, vaErrorStr(vas));
>>          return AVERROR(EIO);
>>      }
>> +    hwctx->display = display;
>>      av_log(ctx, AV_LOG_VERBOSE, "Initialised VAAPI connection: "
>>             "version %d.%d\n", major, minor);
>>  
> 
> Would that mean it doesn't free the display that was created with
> vaGetDisplay? Is that right?
> 
> In my experiments, calling vaTerminate right after vaGetDisplay works
> just fine.

Right, looking more carefully at libva that is exactly what you are meant to do, and the code there is careful to make it all work.  The segfault case I was thinking of here isn't exactly the same (and used the Intel proprietary driver, which should probably be considered dubious), so applying it was premature.

Aman, can you explain more about the case you saw this in?

- Mark


More information about the ffmpeg-devel mailing list