msi: Remove limit on number of handles.
diff --git a/dlls/msi/handle.c b/dlls/msi/handle.c index 1cd82b3..3bcdb46 100644 --- a/dlls/msi/handle.c +++ b/dlls/msi/handle.c
@@ -57,7 +57,8 @@ DWORD dwThreadId; } msi_handle_info; -static msi_handle_info msihandletable[MSIMAXHANDLES]; +static msi_handle_info *msihandletable = NULL; +static int msihandletable_size = 0; MSIHANDLE alloc_msihandle( MSIOBJECTHDR *obj ) { @@ -67,11 +68,29 @@ EnterCriticalSection( &MSI_handle_cs ); /* find a slot */ - for(i=0; i<MSIMAXHANDLES; i++) + for(i=0; i<msihandletable_size; i++) if( !msihandletable[i].obj ) break; - if( (i>=MSIMAXHANDLES) || msihandletable[i].obj ) - goto out; + if( i==msihandletable_size ) + { + msi_handle_info *p; + int newsize; + if (msihandletable_size == 0) + { + newsize = 256; + p = msi_alloc_zero(newsize*sizeof(msi_handle_info)); + } + else + { + newsize = msihandletable_size * 2; + p = msi_realloc_zero(msihandletable, + newsize*sizeof(msi_handle_info)); + } + if (!p) + goto out; + msihandletable = p; + msihandletable_size = newsize; + } msiobj_addref( obj ); msihandletable[i].obj = obj; @@ -92,7 +111,7 @@ handle--; if( handle<0 ) goto out; - if( handle>=MSIMAXHANDLES ) + if( handle>=msihandletable_size ) goto out; if( !msihandletable[handle].obj ) goto out; @@ -230,14 +249,18 @@ TRACE("\n"); - for(i=0; i<MSIMAXHANDLES; i++) + EnterCriticalSection( &MSI_handle_cs ); + for(i=0; i<msihandletable_size; i++) { if(msihandletable[i].dwThreadId == GetCurrentThreadId()) { + LeaveCriticalSection( &MSI_handle_cs ); MsiCloseHandle( i+1 ); + EnterCriticalSection( &MSI_handle_cs ); n++; } } + LeaveCriticalSection( &MSI_handle_cs ); return n; }