diff --git a/dlls/msi/action.c b/dlls/msi/action.c index f33e00c28bc..7e9d0ef7405 100644 --- a/dlls/msi/action.c +++ b/dlls/msi/action.c @@ -1070,7 +1070,6 @@ static UINT load_feature(MSIRECORD * row, LPVOID param) { MSIPACKAGE* package = (MSIPACKAGE*)param; MSIFEATURE* feature; - DWORD sz; static const WCHAR Query1[] = {'S','E','L','E','C','T',' ', '`','C','o','m','p','o','n','e','n','t','_','`', @@ -1090,15 +1089,11 @@ static UINT load_feature(MSIRECORD * row, LPVOID param) list_init( &feature->Components ); - sz = IDENTIFIER_SIZE; - MSI_RecordGetStringW(row,1,feature->Feature,&sz); + feature->Feature = load_dynamic_stringW( row, 1 ); TRACE("Loading feature %s\n",debugstr_w(feature->Feature)); - sz = IDENTIFIER_SIZE; - if (!MSI_RecordIsNull(row,2)) - MSI_RecordGetStringW(row,2,feature->Feature_Parent,&sz); - + feature->Feature_Parent = load_dynamic_stringW( row, 2 ); feature->Title = load_dynamic_stringW( row, 3 ); feature->Description = load_dynamic_stringW( row, 4 ); @@ -1106,11 +1101,7 @@ static UINT load_feature(MSIRECORD * row, LPVOID param) feature->Display = MSI_RecordGetInteger(row,5); feature->Level= MSI_RecordGetInteger(row,6); - - sz = IDENTIFIER_SIZE; - if (!MSI_RecordIsNull(row,7)) - MSI_RecordGetStringW(row,7,feature->Directory,&sz); - + feature->Directory = load_dynamic_stringW( row, 7 ); feature->Attributes = MSI_RecordGetInteger(row,8); feature->Installed = INSTALLSTATE_ABSENT; @@ -3280,7 +3271,7 @@ static UINT ACTION_PublishFeatures(MSIPACKAGE *package) { size += 21; } - if (feature->Feature_Parent[0]) + if (feature->Feature_Parent) size += strlenW( feature->Feature_Parent )+2; data = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR)); @@ -3301,7 +3292,7 @@ static UINT ACTION_PublishFeatures(MSIPACKAGE *package) strcatW(data,buf); } } - if (feature->Feature_Parent[0]) + if (feature->Feature_Parent) { static const WCHAR sep[] = {'\2',0}; strcatW(data,sep); @@ -3312,18 +3303,22 @@ static UINT ACTION_PublishFeatures(MSIPACKAGE *package) RegSetValueExW( hkey, feature->Feature, 0, REG_SZ, (LPBYTE)data,size ); HeapFree(GetProcessHeap(),0,data); + size = 0; + if (feature->Feature_Parent) + size = strlenW(feature->Feature_Parent)*sizeof(WCHAR); if (!absent) { - size = strlenW(feature->Feature_Parent)*sizeof(WCHAR); RegSetValueExW(hukey,feature->Feature,0,REG_SZ, (LPBYTE)feature->Feature_Parent,size); } else { - size = (strlenW(feature->Feature_Parent)+2)* sizeof(WCHAR); + size += 2*sizeof(WCHAR); data = HeapAlloc(GetProcessHeap(),0,size); data[0] = 0x6; - strcpyW( &data[1], feature->Feature_Parent ); + data[1] = 0; + if (feature->Feature_Parent) + strcpyW( &data[1], feature->Feature_Parent ); RegSetValueExW(hukey,feature->Feature,0,REG_SZ, (LPBYTE)data,size); HeapFree(GetProcessHeap(),0,data); diff --git a/dlls/msi/action.h b/dlls/msi/action.h index f030a242331..213e98d559a 100644 --- a/dlls/msi/action.h +++ b/dlls/msi/action.h @@ -23,18 +23,16 @@ #include "wine/list.h" -#define IDENTIFIER_SIZE 96 - typedef struct tagMSIFEATURE { struct list entry; - WCHAR Feature[IDENTIFIER_SIZE]; - WCHAR Feature_Parent[IDENTIFIER_SIZE]; + LPWSTR Feature; + LPWSTR Feature_Parent; LPWSTR Title; LPWSTR Description; INT Display; INT Level; - WCHAR Directory[IDENTIFIER_SIZE]; + LPWSTR Directory; INT Attributes; INSTALLSTATE Installed; diff --git a/dlls/msi/helpers.c b/dlls/msi/helpers.c index 89507dcac0d..6721d0656e8 100644 --- a/dlls/msi/helpers.c +++ b/dlls/msi/helpers.c @@ -438,6 +438,9 @@ static void free_feature( MSIFEATURE *feature ) list_remove( &cl->entry ); HeapFree( GetProcessHeap(), 0, cl ); } + HeapFree( GetProcessHeap(), 0, feature->Feature ); + HeapFree( GetProcessHeap(), 0, feature->Feature_Parent ); + HeapFree( GetProcessHeap(), 0, feature->Directory ); HeapFree( GetProcessHeap(), 0, feature->Description ); HeapFree( GetProcessHeap(), 0, feature->Title ); HeapFree( GetProcessHeap(), 0, feature );