[Mesa-dev] [PATCH 01/13] glx: Don't create a shared context if the other context isn't the same kind
Jose Fonseca
jfonseca at vmware.com
Wed Dec 21 07:29:26 PST 2011
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.
Jose
----- 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