Fix memory leaks in the table code.
This commit is contained in:
parent
dcb0f239fe
commit
230e71cc18
|
@ -272,7 +272,6 @@ extern MSIHANDLE msiobj_findhandle( MSIOBJECTHDR *hdr );
|
||||||
/* add this table to the list of cached tables in the database */
|
/* add this table to the list of cached tables in the database */
|
||||||
extern void add_table(MSIDATABASE *db, MSITABLE *table);
|
extern void add_table(MSIDATABASE *db, MSITABLE *table);
|
||||||
extern void remove_table( MSIDATABASE *db, MSITABLE *table );
|
extern void remove_table( MSIDATABASE *db, MSITABLE *table );
|
||||||
extern void free_table( MSIDATABASE *db, MSITABLE *table );
|
|
||||||
extern void free_cached_tables( MSIDATABASE *db );
|
extern void free_cached_tables( MSIDATABASE *db );
|
||||||
extern UINT find_cached_table(MSIDATABASE *db, LPCWSTR name, MSITABLE **table);
|
extern UINT find_cached_table(MSIDATABASE *db, LPCWSTR name, MSITABLE **table);
|
||||||
extern UINT get_table(MSIDATABASE *db, LPCWSTR name, MSITABLE **table);
|
extern UINT get_table(MSIDATABASE *db, LPCWSTR name, MSITABLE **table);
|
||||||
|
|
|
@ -396,6 +396,15 @@ end:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void free_table( MSITABLE *table )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for( i=0; i<table->row_count; i++ )
|
||||||
|
HeapFree( GetProcessHeap(), 0, table->data[i] );
|
||||||
|
HeapFree( GetProcessHeap(), 0, table->data );
|
||||||
|
HeapFree( GetProcessHeap(), 0, table );
|
||||||
|
}
|
||||||
|
|
||||||
static UINT read_table_from_storage( MSIDATABASE *db, LPCWSTR name, MSITABLE **ptable)
|
static UINT read_table_from_storage( MSIDATABASE *db, LPCWSTR name, MSITABLE **ptable)
|
||||||
{
|
{
|
||||||
MSITABLE *t;
|
MSITABLE *t;
|
||||||
|
@ -443,7 +452,10 @@ static UINT read_table_from_storage( MSIDATABASE *db, LPCWSTR name, MSITABLE **p
|
||||||
t->data = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
|
t->data = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
|
||||||
t->row_count * sizeof (USHORT*) );
|
t->row_count * sizeof (USHORT*) );
|
||||||
if( !t->data )
|
if( !t->data )
|
||||||
return ERROR_NOT_ENOUGH_MEMORY; /* FIXME: memory leak */
|
{
|
||||||
|
r = ERROR_NOT_ENOUGH_MEMORY;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
/* transpose all the data */
|
/* transpose all the data */
|
||||||
TRACE("Transposing data from %d columns\n", t->row_count );
|
TRACE("Transposing data from %d columns\n", t->row_count );
|
||||||
|
@ -451,7 +463,10 @@ static UINT read_table_from_storage( MSIDATABASE *db, LPCWSTR name, MSITABLE **p
|
||||||
{
|
{
|
||||||
t->data[i] = HeapAlloc( GetProcessHeap(), 0, row_size );
|
t->data[i] = HeapAlloc( GetProcessHeap(), 0, row_size );
|
||||||
if( !t->data[i] )
|
if( !t->data[i] )
|
||||||
return ERROR_NOT_ENOUGH_MEMORY; /* FIXME: memory leak */
|
{
|
||||||
|
r = ERROR_NOT_ENOUGH_MEMORY;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
for( j=0; j<num_cols; j++ )
|
for( j=0; j<num_cols; j++ )
|
||||||
{
|
{
|
||||||
UINT ofs = cols[j].offset/2;
|
UINT ofs = cols[j].offset/2;
|
||||||
|
@ -468,7 +483,8 @@ static UINT read_table_from_storage( MSIDATABASE *db, LPCWSTR name, MSITABLE **p
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ERR("oops - unknown column width %d\n", n);
|
ERR("oops - unknown column width %d\n", n);
|
||||||
return ERROR_FUNCTION_FAILED;
|
r = ERROR_FUNCTION_FAILED;
|
||||||
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -477,6 +493,12 @@ static UINT read_table_from_storage( MSIDATABASE *db, LPCWSTR name, MSITABLE **p
|
||||||
HeapFree( GetProcessHeap(), 0, rawdata );
|
HeapFree( GetProcessHeap(), 0, rawdata );
|
||||||
|
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
|
|
||||||
|
err:
|
||||||
|
HeapFree( GetProcessHeap(), 0, cols );
|
||||||
|
HeapFree( GetProcessHeap(), 0, rawdata );
|
||||||
|
free_table( t );
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add this table to the list of cached tables in the database */
|
/* add this table to the list of cached tables in the database */
|
||||||
|
@ -499,9 +521,8 @@ static void release_table( MSIDATABASE *db, MSITABLE *table )
|
||||||
if( !table->ref_count )
|
if( !table->ref_count )
|
||||||
{
|
{
|
||||||
remove_table( db, table );
|
remove_table( db, table );
|
||||||
HeapFree( GetProcessHeap(), 0, table->data );
|
TRACE("Destroying table %s\n", debugstr_w(table->name));
|
||||||
HeapFree( GetProcessHeap(), 0, table );
|
free_table( table );
|
||||||
TRACE("Destroyed table %s\n", debugstr_w(table->name));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue