Checking with valgrind I got some invalid reads. The message was like the 
following:

==6988== Invalid read of size 4
==6988==    at 0x4B3C7FD: intersect_rect (radeon_state.c:61)
==6988==    by 0x4B3C9DA: radeonRecalcScissorRects (radeon_state.c:108)
==6988==    by 0x4B3CAEC: radeonUpdateScissor (radeon_state.c:131)
==6988==    by 0x4B3CD04: radeonEnable (radeon_state.c:205)
==6988==    by 0x4B4B1C1: r300Enable (r300_state.c:542)
==6988==    by 0x4D13827: _mesa_set_enable (enable.c:956)
==6988==    by 0x4D138A6: _mesa_Enable (enable.c:971)
==6988==    by 0x4769879: glEnable (glapitemp.h:1160)
==6988==    by 0x4613A5F: 
osgUtil::RenderStage::drawImplementation(osg::RenderInfo&, 
osgUtil::RenderLeaf*&) (in /usr/lib/libosgUtil.so)
==6988==    by 0x4607658: osgUtil::RenderBin::draw(osg::RenderInfo&, 
osgUtil::RenderLeaf*&) (in /usr/lib/libosgUtil.so)
==6988==    by 0x46133BC: osgUtil::RenderStage::drawInner(osg::RenderInfo&, 
osgUtil::RenderLeaf*&, bool&) (in /usr/lib/libosgUtil.so)
==6988==    by 0x4612E6C: osgUtil::RenderStage::draw(osg::RenderInfo&, 
osgUtil::RenderLeaf*&) (in /usr/lib/libosgUtil.so)
==6988==  Address 0x4AF585C is 4 bytes inside a block of size 8 free'd
==6988==    at 0x402303F: free (vg_replace_malloc.c:233)
==6988==    by 0x4BAF503: _mesa_free (imports.c:93)
==6988==    by 0x4B2FF84: __driUtilUpdateDrawableInfo (dri_util.c:430)
==6988==    by 0x4B2FD46: DoBindContext (dri_util.c:339)
==6988==    by 0x4B2FF00: driBindContext (dri_util.c:383)
==6988==    by 0x4735921: BindContextWrapper (glxext.c:1620)
==6988==    by 0x4735A53: MakeContextCurrent (glxext.c:1674)
==6988==    by 0x4735D7C: glXMakeCurrent (glxext.c:1796)
==6988==    by 0x47D8BB3: Producer::RenderSurface::makeCurrent(bool) (in 
/usr/lib/libProducer.so)
==6988==    by 0x47DEEC6: Producer::Camera::_frame(bool) (in 
/usr/lib/libProducer.so)
==6988==    by 0x47DF75F: Producer::Camera::frame(bool) (in 
/usr/lib/libProducer.so)
==6988==    by 0x47E2589: Producer::CameraGroup::_singleThreadedFrame() (in 
/usr/lib/libProducer.so)

So I searched a bit, and I created the following patch, which touches 
src/mesa/drivers/dri/common/dri_util.c, 
and more specifically __driUtilUpdateDrawableInfo, calling _mesa_free for 
pdp->pClipRects and pdp->pBackClipRects
only inside if.

Does this look sane?

Valgrind does not warn anymore.

-- 
Papadakos Panagiotis
--- src/mesa/drivers/dri/common/dri_util.c	2007-02-01 19:11:25.000000000 +0200
+++ src/mesa/drivers/dri/common/dri_util_new.c	2007-02-01 19:02:44.000000000 +0200
@@ -426,14 +426,6 @@
 	return;
     }
 
-    if (pdp->pClipRects) {
-	_mesa_free(pdp->pClipRects); 
-    }
-
-    if (pdp->pBackClipRects) {
-	_mesa_free(pdp->pBackClipRects); 
-    }
-
     DRM_SPINUNLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID);
 
     if (!__driFindDrawable(psp->drawHash, pdp->draw) ||
@@ -448,7 +440,16 @@
 	/* Error -- eg the window may have been destroyed.  Keep going
 	 * with no cliprects.
 	 */
-        pdp->pStamp = &pdp->lastStamp; /* prevent endless loop */
+
+	if (pdp->pClipRects) {
+	    _mesa_free(pdp->pClipRects);
+	}
+
+	if (pdp->pBackClipRects) {
+	    _mesa_free(pdp->pBackClipRects);
+	}
+
+	pdp->pStamp = &pdp->lastStamp; /* prevent endless loop */
 	pdp->numClipRects = 0;
 	pdp->pClipRects = NULL;
 	pdp->numBackClipRects = 0;
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier.
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to