accelerants/radeon: Fix potential memory leak

* Fix potential leak of 'node' at line 147, which is allocated
  at line 123. Pointed out by Clang Static Analyzer.
* Remove trailing tabs.

Change-Id: I2289dfb5a9d0ada1fd7fc3854906d66a730b5bcb
Reviewed-on: https://review.haiku-os.org/c/1058
Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
Murai Takashi
2019-02-19 18:31:44 +00:00
committed by waddlesplash
parent 4512141632
commit b7223dc11f
@@ -1,9 +1,9 @@
/* /*
Copyright (c) 2002, Thomas Kurschel Copyright (c) 2002, Thomas Kurschel
Part of Radeon accelerant Part of Radeon accelerant
Overlay interface Overlay interface
*/ */
@@ -31,7 +31,7 @@ uint32 OVERLAY_COUNT( const display_mode *dm )
SHOW_FLOW0( 3, "" ); SHOW_FLOW0( 3, "" );
(void) dm; (void) dm;
return 1; return 1;
} }
@@ -41,7 +41,7 @@ uint32 OVERLAY_COUNT( const display_mode *dm )
const uint32 *OVERLAY_SUPPORTED_SPACES( const display_mode *dm ) const uint32 *OVERLAY_SUPPORTED_SPACES( const display_mode *dm )
{ {
SHOW_FLOW0( 3, "" ); SHOW_FLOW0( 3, "" );
(void) dm; (void) dm;
return overlay_colorspaces; return overlay_colorspaces;
@@ -53,7 +53,7 @@ const uint32 *OVERLAY_SUPPORTED_SPACES( const display_mode *dm )
uint32 OVERLAY_SUPPORTED_FEATURES( uint32 color_space ) uint32 OVERLAY_SUPPORTED_FEATURES( uint32 color_space )
{ {
SHOW_FLOW0( 3, "" ); SHOW_FLOW0( 3, "" );
(void) color_space; (void) color_space;
return return
@@ -75,7 +75,7 @@ const overlay_buffer *ALLOCATE_OVERLAY_BUFFER( color_space cs, uint16 width, uin
overlay_buffer *buffer; overlay_buffer *buffer;
status_t result; status_t result;
uint ati_space, test_reg, bpp; uint ati_space, test_reg, bpp;
SHOW_FLOW0( 3, "" ); SHOW_FLOW0( 3, "" );
switch( cs ) { switch( cs ) {
@@ -119,11 +119,11 @@ const overlay_buffer *ALLOCATE_OVERLAY_BUFFER( color_space cs, uint16 width, uin
SHOW_FLOW( 3, "Unsupported format (%x)", (int)cs ); SHOW_FLOW( 3, "Unsupported format (%x)", (int)cs );
return NULL; return NULL;
} }
node = malloc( sizeof( overlay_buffer_node )); node = malloc( sizeof( overlay_buffer_node ));
if( node == NULL ) if( node == NULL )
return NULL; return NULL;
node->ati_space = ati_space; node->ati_space = ati_space;
node->test_reg = test_reg; node->test_reg = test_reg;
@@ -131,42 +131,43 @@ const overlay_buffer *ALLOCATE_OVERLAY_BUFFER( color_space cs, uint16 width, uin
// alloc graphics mem // alloc graphics mem
buffer = &node->buffer; buffer = &node->buffer;
buffer->space = cs; buffer->space = cs;
buffer->width = width; buffer->width = width;
buffer->height = height; buffer->height = height;
buffer->bytes_per_row = (width * bpp + 0xf) & ~0xf; buffer->bytes_per_row = (width * bpp + 0xf) & ~0xf;
am.magic = RADEON_PRIVATE_DATA_MAGIC; am.magic = RADEON_PRIVATE_DATA_MAGIC;
am.size = buffer->bytes_per_row * height; am.size = buffer->bytes_per_row * height;
am.memory_type = mt_local; am.memory_type = mt_local;
am.global = false; am.global = false;
result = ioctl( ai->fd, RADEON_ALLOC_MEM, &am ); result = ioctl( ai->fd, RADEON_ALLOC_MEM, &am );
if( result != B_OK ) if( result != B_OK )
goto err; goto err;
node->mem_handle = am.handle; node->mem_handle = am.handle;
node->mem_offset = am.offset; node->mem_offset = am.offset;
buffer->buffer = si->local_mem + am.offset; buffer->buffer = si->local_mem + am.offset;
buffer->buffer_dma = (void *) ((unsigned long) si->framebuffer_pci + am.offset); buffer->buffer_dma = (void *) ((unsigned long) si->framebuffer_pci + am.offset);
// add to list of overlays // add to list of overlays
node->next = vc->overlay_buffers; node->next = vc->overlay_buffers;
node->prev = NULL; node->prev = NULL;
if( node->next ) if( node->next )
node->next->prev = node; node->next->prev = node;
vc->overlay_buffers = node; vc->overlay_buffers = node;
RELEASE_BEN( si->engine.lock ); RELEASE_BEN( si->engine.lock );
SHOW_FLOW( 0, "success: mem_handle=%x, offset=%x, CPU-address=%x, phys-address=%x", SHOW_FLOW( 0, "success: mem_handle=%x, offset=%x, CPU-address=%x, phys-address=%x",
node->mem_handle, node->mem_offset, buffer->buffer, buffer->buffer_dma ); node->mem_handle, node->mem_offset, buffer->buffer, buffer->buffer_dma );
return buffer; return buffer;
err: err:
free(node);
RELEASE_BEN( si->engine.lock ); RELEASE_BEN( si->engine.lock );
return NULL; return NULL;
} }
@@ -180,20 +181,20 @@ status_t RELEASE_OVERLAY_BUFFER( const overlay_buffer *ob )
overlay_buffer_node *node; overlay_buffer_node *node;
radeon_free_mem fm; radeon_free_mem fm;
status_t result; status_t result;
SHOW_FLOW0( 3, "" ); SHOW_FLOW0( 3, "" );
node = (overlay_buffer_node *)((char *)ob - offsetof( overlay_buffer_node, buffer )); node = (overlay_buffer_node *)((char *)ob - offsetof( overlay_buffer_node, buffer ));
if( si->active_overlay.on == node || si->active_overlay.prev_on ) if( si->active_overlay.on == node || si->active_overlay.prev_on )
Radeon_HideOverlay( ai ); Radeon_HideOverlay( ai );
// free memory // free memory
fm.magic = RADEON_PRIVATE_DATA_MAGIC; fm.magic = RADEON_PRIVATE_DATA_MAGIC;
fm.handle = node->mem_handle; fm.handle = node->mem_handle;
fm.memory_type = mt_local; fm.memory_type = mt_local;
fm.global = false; fm.global = false;
result = ioctl( ai->fd, RADEON_FREE_MEM, &fm ); result = ioctl( ai->fd, RADEON_FREE_MEM, &fm );
if( result != B_OK ) { if( result != B_OK ) {
SHOW_FLOW( 3, "ups - couldn't free memory (handle=%x, status=%s)", SHOW_FLOW( 3, "ups - couldn't free memory (handle=%x, status=%s)",
@@ -205,16 +206,16 @@ status_t RELEASE_OVERLAY_BUFFER( const overlay_buffer *ob )
// remove from list // remove from list
if( node->next ) if( node->next )
node->next->prev = node->prev; node->next->prev = node->prev;
if( node->prev ) if( node->prev )
node->prev->next = node->next; node->prev->next = node->next;
else else
vc->overlay_buffers = node->next; vc->overlay_buffers = node->next;
RELEASE_BEN( si->engine.lock ); RELEASE_BEN( si->engine.lock );
SHOW_FLOW0( 3, "success" ); SHOW_FLOW0( 3, "success" );
return B_OK; return B_OK;
} }
@@ -229,11 +230,11 @@ status_t GET_OVERLAY_CONSTRAINTS( const display_mode *dm, const overlay_buffer *
// which should know what it's doing // which should know what it's doing
if( dm == NULL || ob == NULL || oc == NULL ) if( dm == NULL || ob == NULL || oc == NULL )
return B_BAD_VALUE; return B_BAD_VALUE;
// scaler input restrictions // scaler input restrictions
// TBD: check all these values; I reckon that // TBD: check all these values; I reckon that
// most of them are too restrictive // most of them are too restrictive
// position // position
oc->view.h_alignment = 0; oc->view.h_alignment = 0;
oc->view.v_alignment = 0; oc->view.v_alignment = 0;
@@ -281,7 +282,7 @@ status_t GET_OVERLAY_CONSTRAINTS( const display_mode *dm, const overlay_buffer *
oc->h_scale.max = 1 << 12; oc->h_scale.max = 1 << 12;
oc->v_scale.min = 1.0f / (1 << 4); oc->v_scale.min = 1.0f / (1 << 4);
oc->v_scale.max = 1 << 12; oc->v_scale.max = 1 << 12;
SHOW_FLOW0( 3, "success" ); SHOW_FLOW0( 3, "success" );
return B_OK; return B_OK;
@@ -293,16 +294,16 @@ overlay_token ALLOCATE_OVERLAY( void )
{ {
shared_info *si = ai->si; shared_info *si = ai->si;
virtual_card *vc = ai->vc; virtual_card *vc = ai->vc;
SHOW_FLOW0( 3, "" ); SHOW_FLOW0( 3, "" );
if( atomic_or( &si->overlay_mgr.inuse, 1 ) != 0 ) { if( atomic_or( &si->overlay_mgr.inuse, 1 ) != 0 ) {
SHOW_FLOW0( 3, "already in use" ); SHOW_FLOW0( 3, "already in use" );
return NULL; return NULL;
} }
SHOW_FLOW0( 3, "success" ); SHOW_FLOW0( 3, "success" );
vc->uses_overlay = true; vc->uses_overlay = true;
return (void *)++si->overlay_mgr.token; return (void *)++si->overlay_mgr.token;
@@ -314,21 +315,21 @@ status_t RELEASE_OVERLAY(overlay_token ot)
{ {
virtual_card *vc = ai->vc; virtual_card *vc = ai->vc;
shared_info *si = ai->si; shared_info *si = ai->si;
SHOW_FLOW0( 3, "" ); SHOW_FLOW0( 3, "" );
if( (void *)si->overlay_mgr.token != ot ) if( (void *)si->overlay_mgr.token != ot )
return B_BAD_VALUE; return B_BAD_VALUE;
if( si->overlay_mgr.inuse == 0 ) if( si->overlay_mgr.inuse == 0 )
return B_ERROR; return B_ERROR;
if( si->active_overlay.on ) if( si->active_overlay.on )
Radeon_HideOverlay( ai ); Radeon_HideOverlay( ai );
si->overlay_mgr.inuse = 0; si->overlay_mgr.inuse = 0;
vc->uses_overlay = false; vc->uses_overlay = false;
SHOW_FLOW0( 3, "released" ); SHOW_FLOW0( 3, "released" );
return B_OK; return B_OK;
@@ -368,10 +369,10 @@ status_t CONFIGURE_OVERLAY( overlay_token ot, const overlay_buffer *ob,
si->pending_overlay.ov = *ov; si->pending_overlay.ov = *ov;
si->pending_overlay.on = (overlay_buffer_node *)((char *)ob - offsetof( overlay_buffer_node, buffer )); si->pending_overlay.on = (overlay_buffer_node *)((char *)ob - offsetof( overlay_buffer_node, buffer ));
result = Radeon_UpdateOverlay( ai ); result = Radeon_UpdateOverlay( ai );
RELEASE_BEN( si->engine.lock ); RELEASE_BEN( si->engine.lock );
return result; return result;
} }