Messages in this thread Patch in this message | | | Date | Mon, 24 Mar 2003 16:41:46 +0000 | From | davej@codemonk ... | Subject | plug DRM memory leak on exit paths. |
| |
Spotted by Oleg Drokin
diff -urpN --exclude-from=/home/davej/.exclude bk-linus/drivers/char/drm/drm_drv.h linux-2.5/drivers/char/drm/drm_drv.h --- bk-linus/drivers/char/drm/drm_drv.h 2003-03-08 09:56:59.000000000 +0000 +++ linux-2.5/drivers/char/drm/drm_drv.h 2003-03-17 23:42:16.000000000 +0000 @@ -581,8 +581,10 @@ static int __init drm_init( void ) init_timer( &dev->timer ); init_waitqueue_head( &dev->context_wait ); - if ((DRM(minor)[i] = DRM(stub_register)(DRIVER_NAME, &DRM(fops),dev)) < 0) - return -EPERM; + if ((DRM(minor)[i] = DRM(stub_register)(DRIVER_NAME, &DRM(fops),dev)) < 0) { + retcode = -EPERM; + goto fail_reg; + } dev->device = MKDEV(DRM_MAJOR, DRM(minor)[i] ); dev->name = DRIVER_NAME; @@ -591,9 +593,8 @@ static int __init drm_init( void ) #if __MUST_HAVE_AGP if ( dev->agp == NULL ) { DRM_ERROR( "Cannot initialize the agpgart module.\n" ); - DRM(stub_unregister)(DRM(minor)[i]); - DRM(takedown)( dev ); - return -ENOMEM; + retcode = -ENOMEM; + goto fail; } #endif #if __REALLY_HAVE_MTRR @@ -609,9 +610,7 @@ static int __init drm_init( void ) retcode = DRM(ctxbitmap_init)( dev ); if( retcode ) { DRM_ERROR( "Cannot allocate memory for context bitmap.\n" ); - DRM(stub_unregister)(DRM(minor)[i]); - DRM(takedown)( dev ); - return retcode; + goto fail; } #endif DRM_INFO( "Initialized %s %d.%d.%d %s on minor %d\n", @@ -626,6 +625,15 @@ static int __init drm_init( void ) DRIVER_POSTINIT(); return 0; + +fail: + DRM(stub_unregister)(DRM(minor)[i]); + DRM(takedown)( dev ); + +fail_reg: + kfree (DRM(device)); + kfree (DRM(minor)); + return retcode; } /* drm_cleanup is called via cleanup_module at module unload time. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |