On Thu, Aug 28, 2003 at 10:47:41AM -0400, Brian Almeida wrote: > On Thursday 28 August 2003 08:07 am, Brian Almeida wrote: > > [Please CC me as I am not subscribed to debian-x] > I got some more info by install xserver-xfree86-dbg and getting > a backtrace: > > Program received signal SIGSEGV, Segmentation fault. > 0x08649121 in __glXCreateDrawablePrivate (pDraw=0x8bd7f80, drawId=2097154, > modes=0x0) at glxutil.c:334 > 334 glxutil.c: No such file or directory. > in glxutil.c > (gdb) bt > #0 0x08649121 in __glXCreateDrawablePrivate (pDraw=0x8bd7f80, drawId=2097154, > modes=0x0) at glxutil.c:334 > #1 0x086493c3 in __glXGetDrawablePrivate (pDraw=0x8bd7f80, drawId=2097154, > modes=0x0) at glxutil.c:426 > #2 0x0866a032 in __glXMakeCurrent (cl=0x8bcfd50, pc=0x8bd03e0 "\232\005\004") > at glxcmds.c:484 > #3 0x08648607 in __glXDispatch (client=0x8bd01a8) at glxext.c:431 > #4 0x0845acc1 in Dispatch () at dispatch.c:450 > #5 0x084708b7 in main (argc=1, argv=0xbffffaf4, envp=0xbffffafc) at > main.c:469
Bad client data? The GLX extension is assuming that this "modes" thing is a valid pointer. __glXCreateDrawablePrivate() is fed bullshit which it gets from __glXGetDrawablePrivate(), which intern gets a pointer to a structure that should be populated correctly by __glXMakeCurrent(). glxcmds.c: 360 /*****************************************************************************/ 361 /* 362 ** Make an OpenGL context and drawable current. 363 */ 364 int __glXMakeCurrent(__GLXclientState *cl, GLbyte *pc) 365 { 366 ClientPtr client = cl->client; 367 DrawablePtr pDraw; 368 xGLXMakeCurrentReq *req = (xGLXMakeCurrentReq *) pc; 369 xGLXMakeCurrentReply reply; 370 GLXDrawable drawId = req->drawable; 371 GLXContextID contextId = req->context; 372 __GLXpixmap *pGlxPixmap = 0; 373 __GLXcontext *glxc, *prevglxc; ^^^^^ Here's the guy that goes to hell. 374 __GLinterface *gc, *prevgc; 375 __GLXdrawablePrivate *glxPriv = NULL; 376 GLXContextTag tag = req->oldContextTag; 377 GLint error; [...] 409 /* 410 ** Lookup new context. It must not be current for someone else. 411 */ 412 if (contextId != None) { 413 glxc = (__GLXcontext *) LookupIDByType(contextId, __glXContextRes); 414 if (!glxc) { 415 client->errorValue = contextId; 416 return __glXBadContext; 417 } 418 if ((glxc != prevglxc) && glxc->isCurrent) { 419 /* Context is current to somebody else */ 420 return BadAccess; 421 } 422 gc = glxc->gc; 423 } else { 424 /* Switching to no context. Ignore new drawable. */ 425 glxc = 0; 426 gc = 0; 427 } The above if block is what initializes glxc. The drawable then undergoes some auditing. 429 if (drawId != None) { 430 pDraw = (DrawablePtr) LookupDrawable(drawId, client); 431 if (pDraw) { 432 if (pDraw->type == DRAWABLE_WINDOW) { 433 /* 434 ** Drawable is an X Window. 435 */ 436 WindowPtr pWin = (WindowPtr)pDraw; 437 VisualID vid = wVisual(pWin); 438 439 /* 440 ** Check if window and context are similar. 441 */ 442 if ((vid != glxc->pVisual->vid) || 443 (pWin->drawable.pScreen != glxc->pScreen)) { 444 client->errorValue = drawId; 445 return BadMatch; 446 } 447 448 } else { 449 /* 450 ** An X Pixmap is not allowed as a parameter (a GLX Pixmap 451 ** is, but it must first be created with glxCreateGLXPixmap). 452 */ 453 client->errorValue = drawId; 454 return __glXBadDrawable; 455 } 456 } else { 457 pGlxPixmap = (__GLXpixmap *) LookupIDByType(drawId, 458 __glXPixmapRes); 459 if (pGlxPixmap) { 460 /* 461 ** Check if pixmap and context are similar. 462 */ 463 if (pGlxPixmap->pScreen != glxc->pScreen || 464 pGlxPixmap->pGlxVisual != glxc->pGlxVisual) { 465 client->errorValue = drawId; 466 return BadMatch; 467 } 468 pDraw = pGlxPixmap->pDraw; 469 470 } else { 471 /* 472 ** Drawable is neither a Window nor a GLXPixmap. 473 */ 474 client->errorValue = drawId; 475 return __glXBadDrawable; 476 } 477 } 478 } else { 479 pDraw = 0; 480 } 481 482 /* get the drawable private */ 483 if (pDraw) { This is our last chance to audit glxc->modes before we pass it along. Presumably we should have scrutinized glxc->modes above, but I don't know what the spec says we should do for client->errorValue and the return value. 484 glxPriv = __glXGetDrawablePrivate(pDraw, drawId, glxc->modes); 485 if (glxPriv == NULL) { 486 return __glXBadDrawable; 487 } 488 } glxutil.c: 417 __GLXdrawablePrivate * 418 __glXGetDrawablePrivate(DrawablePtr pDraw, XID drawId, 419 __GLcontextModes *modes) 420 { 421 __GLXdrawablePrivate *glxPriv; 422 423 glxPriv = __glXFindDrawablePrivate(drawId); 424 425 if (glxPriv == NULL) { 426 glxPriv = __glXCreateDrawablePrivate(pDraw, drawId, modes); 427 if (glxPriv) { 428 __glXRefDrawablePrivate(glxPriv); 429 } 430 } 431 432 return glxPriv; 433 } 306 __GLXdrawablePrivate * 307 __glXCreateDrawablePrivate(DrawablePtr pDraw, XID drawId, 308 __GLcontextModes *modes) 309 { 310 __GLXdrawablePrivate *glxPriv; 311 __GLdrawablePrivate *glPriv; 312 __GLXscreenInfo *pGlxScreen; 313 314 glxPriv = (__GLXdrawablePrivate *) __glXMalloc(sizeof(*glxPriv)); 315 __glXMemset(glxPriv, 0, sizeof(__GLXdrawablePrivate)); 316 317 glxPriv->type = pDraw->type; 318 glxPriv->pDraw = pDraw; 319 glxPriv->drawId = drawId; 320 321 /* if not a pixmap, lookup will fail, so pGlxPixmap will be NULL */ 322 glxPriv->pGlxPixmap = (__GLXpixmap *) 323 LookupIDByType(drawId, __glXPixmapRes); 324 /* since we are creating the drawablePrivate, drawId should be new */ 325 if (!AddResource(drawId, __glXDrawableRes, glxPriv)) { 326 /* oops! */ 327 __glXFree(glxPriv); 328 return NULL; 329 } 330 331 /* fill up glPriv */ 332 glPriv = &glxPriv->glPriv; 333 glPriv->modes = (__GLcontextModes *) __glXMalloc(sizeof(__GLcontextModes)); 334 *glPriv->modes = *modes; Boom. modes is a null pointer. Someone knowledgeable about GLX know what to do about this? -- G. Branden Robinson | The errors of great men are Debian GNU/Linux | venerable because they are more [EMAIL PROTECTED] | fruitful than the truths of little http://people.debian.org/~branden/ | men. -- Friedrich Nietzsche
pgp3MPQJVtyzB.pgp
Description: PGP signature