diff --git a/dlls/msi/handle.c b/dlls/msi/handle.c index 1cd82b37d2d..3bcdb46f3f4 100644 --- a/dlls/msi/handle.c +++ b/dlls/msi/handle.c @@ -57,7 +57,8 @@ typedef struct msi_handle_info_t 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 @@ MSIHANDLE alloc_msihandle( MSIOBJECTHDR *obj ) EnterCriticalSection( &MSI_handle_cs ); /* find a slot */ - for(i=0; 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 @@ void *msihandle2msiinfo(MSIHANDLE handle, UINT type) 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 @@ UINT WINAPI MsiCloseAllHandles(void) TRACE("\n"); - for(i=0; i