[Mesa-dev] [PATCH] glx: Be slightly more tolerant in glXImportContext

Eric Anholt eric at anholt.net
Tue Sep 26 18:59:53 UTC 2017


Adam Jackson <ajax at redhat.com> writes:

> Ugh the GLX code. __GLX_MAX_CONTEXT_PROPS is 3 because glxproto.h is
> just a pile of ancient runes, so when the server begins sending more
> than 3 context properties this code refuses to work _at all_.
>
> This extension is pretty obscure, so this probably isn't a big deal (if
> it was we'd need to hack the server side to send fewer properties unless
> the client seemed to be "new enough"). And we're probably not going to
> ever have tremendous numbers of context properties. So bump the number
> we'll accept in a reply out to 32 (since we still want to avoid overflow
> etc.) and copy in just the ones we know about, as since these will be
> indirect contexts the client library probably needs to be explicitly
> aware of any new context state.
>
> Signed-off-by: Adam Jackson <ajax at redhat.com>
> ---
>  src/glx/glxcmds.c | 18 ++++++++++++------
>  1 file changed, 12 insertions(+), 6 deletions(-)
>
> diff --git a/src/glx/glxcmds.c b/src/glx/glxcmds.c
> index 29b94b8810..fd917671eb 100644
> --- a/src/glx/glxcmds.c
> +++ b/src/glx/glxcmds.c
> @@ -1395,6 +1395,16 @@ GLX_ALIAS(Display *, glXGetCurrentDisplayEXT, (void), (),
>            glXGetCurrentDisplay)
>  
>  #ifndef GLX_USE_APPLEGL
> +
> +/*
> + * This is just a random large number, so that the server can start sending
> + * more properties and we won't arbitrarily reject it, but we still won't save
> + * any attributes we don't know about, since the correct usage of an imported
> + * (and thus indirect) context almost certainly requires explicit awareness in
> + * libGL of any extensions in use. Right now we know about 5, 32 should be
> + * plenty of headroom.
> + */
> +#define MAX_CONTEXT_PROPS 32
>  _GLX_PUBLIC GLXContext
>  glXImportContextEXT(Display *dpy, GLXContextID contextID)
>  {
> @@ -1403,11 +1413,7 @@ glXImportContextEXT(Display *dpy, GLXContextID contextID)
>     xGLXQueryContextReply reply;
>     CARD8 opcode;
>     struct glx_context *ctx;
> -
> -   /* This GLX implementation knows about 5 different properties, so
> -    * allow the server to send us one of each.
> -    */
> -   int propList[5 * 2], *pProp, nPropListBytes;
> +   int propList[MAX_CONTEXT_PROPS * 2], *pProp, nPropListBytes;
>     int numProps;
>     int i, renderType;
>     XID share;
> @@ -1471,7 +1477,7 @@ glXImportContextEXT(Display *dpy, GLXContextID contextID)
>  
>     _XReply(dpy, (xReply *) & reply, 0, False);
>  
> -   if (reply.n <= __GLX_MAX_CONTEXT_PROPS)
> +   if (reply.n <= MAX_CONTEXT_PROPS)
>        nPropListBytes = reply.n * 2 * sizeof propList[0];
>     else
>        nPropListBytes = 0;

Instead of magic numbers, couldn't we just malloc the proplist here and
free it after the loop?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 832 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170926/6c80b1f2/attachment.sig>


More information about the mesa-dev mailing list