[Mesa-dev] [PATCH 01/13] glx: Don't create a shared context if the other context isn't the same kind

Ian Romanick idr at freedesktop.org
Wed Dec 21 10:13:45 PST 2011


On 12/21/2011 07:29 AM, Jose Fonseca wrote:
> Looks a sensible thing to do.
>
> I assume no DRI driver will ever want to hook vtable->destroy. If
> that  may eventually happen, then may be it is useful to add an
> assert(vtable->destroy == dri2_destroy_context) when the context is created.

This particular vtable isn't visible to the driver.  It is only used by 
the application facing part of GLX and the particular protocol back-end 
(DRI, DRI2, indirect GLX, etc.) being used.  The other thing I had 
thought of checking was that vtable pointed to the correct 
glx_screen_vtable (look for dri2_screen_vtable in src/glx/dri2_glx.c).

> ----- Original Message -----
>> From: Ian Romanick<ian.d.romanick at intel.com>
>>
>> Each of the DRI, DRI2, and DRISW backends contain code like the
>> following in their create-context routine:
>>
>>     if (shareList) {
>>        pcp_shared = (struct dri2_context *) shareList;
>>        shared = pcp_shared->driContext;
>>     }
>>
>> This assumes that the glx_context *shareList is actually the correct
>> derived type.  However, if shareList was created as an
>> indirect-rendering context, it will not be the expected type.  As a
>> result, shared will contain garbage.  This garbage will be passed to
>> the driver, and the driver will probably segfault.  This can be
>> observed with the following GLX code:
>>
>>      ctx0 = glXCreateContext(dpy, visinfo, NULL, False);
>>      ctx1 = glXCreateContext(dpy, visinfo, ctx0, True);
>>
>> Create-context is the only case where this occurs.  All other cases
>> where a context is passed to the backend, it is the 'this' pointer
>> (i.e., we got to the backend by call something from ctx->vtable).
>>
>> To work around this, check that the shareList->vtable->destroy method
>> is the same as the destroy method of the expected type.  We could
>> also
>> check that shareList->vtable matches the vtable or by adding a "tag"
>> to glx_context to identify the derived type.
>>
>> NOTE: This is a candidate for the 7.11 branch.
>>
>> Signed-off-by: Ian Romanick<ian.d.romanick at intel.com>
>> ---
>>   src/glx/dri2_glx.c  |    7 +++++++
>>   src/glx/dri_glx.c   |    7 +++++++
>>   src/glx/drisw_glx.c |    7 +++++++
>>   3 files changed, 21 insertions(+), 0 deletions(-)
>>
>> diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c
>> index 553869a..f929fdd 100644
>> --- a/src/glx/dri2_glx.c
>> +++ b/src/glx/dri2_glx.c
>> @@ -185,6 +185,13 @@ dri2_create_context(struct glx_screen *base,
>>      __DRIcontext *shared = NULL;
>>
>>      if (shareList) {
>> +      /* If the shareList context is not a DRI2 context, we cannot
>> possibly
>> +       * create a DRI2 context that shares it.
>> +       */
>> +      if (shareList->vtable->destroy != dri2_destroy_context) {
>> +	 return NULL;
>> +      }
>> +
>>         pcp_shared = (struct dri2_context *) shareList;
>>         shared = pcp_shared->driContext;
>>      }
>> diff --git a/src/glx/dri_glx.c b/src/glx/dri_glx.c
>> index 666423a..9365224 100644
>> --- a/src/glx/dri_glx.c
>> +++ b/src/glx/dri_glx.c
>> @@ -587,6 +587,13 @@ dri_create_context(struct glx_screen *base,
>>         return NULL;
>>
>>      if (shareList) {
>> +      /* If the shareList context is not a DRI context, we cannot
>> possibly
>> +       * create a DRI context that shares it.
>> +       */
>> +      if (shareList->vtable->destroy != dri_destroy_context) {
>> +	 return NULL;
>> +      }
>> +
>>         pcp_shared = (struct dri_context *) shareList;
>>         shared = pcp_shared->driContext;
>>      }
>> diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c
>> index fbc6be2..f988eeb 100644
>> --- a/src/glx/drisw_glx.c
>> +++ b/src/glx/drisw_glx.c
>> @@ -382,6 +382,13 @@ drisw_create_context(struct glx_screen *base,
>>         return NULL;
>>
>>      if (shareList) {
>> +      /* If the shareList context is not a DRISW context, we cannot
>> possibly
>> +       * create a DRISW context that shares it.
>> +       */
>> +      if (shareList->vtable->destroy != drisw_destroy_context) {
>> +	 return NULL;
>> +      }
>> +
>>         pcp_shared = (struct drisw_context *) shareList;
>>         shared = pcp_shared->driContext;
>>      }
>> --
>> 1.7.6.4
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list