Module: wine Branch: master Commit: 089411747ba5f56b99262d8cd3bfc9c0a807ba22 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=089411747ba5f56b99262d8c...
Author: Mike McCormack mike@codeweavers.com Date: Thu Aug 24 20:19:43 2006 +0900
msi: Fix strings with lengths that are exact multiples of 2^16.
---
dlls/msi/table.c | 45 +++++++++++++++++++++++++++++---------------- 1 files changed, 29 insertions(+), 16 deletions(-)
diff --git a/dlls/msi/table.c b/dlls/msi/table.c index 1a3ccb2..57cd4df 100644 --- a/dlls/msi/table.c +++ b/dlls/msi/table.c @@ -686,7 +686,7 @@ string_table *load_string_table( IStorag CHAR *data = NULL; USHORT *pool = NULL; UINT r, datasize = 0, poolsize = 0, codepage; - DWORD i, count, offset, len, n; + DWORD i, count, offset, len, n, refs; static const WCHAR szStringData[] = { '_','S','t','r','i','n','g','D','a','t','a',0 }; static const WCHAR szStringPool[] = { @@ -708,38 +708,51 @@ string_table *load_string_table( IStorag
offset = 0; n = 1; - for( i=1; i<count; i++ ) + i = 1; + while( i<count ) { - len = pool[i*2]; + /* the string reference count is always the second word */ + refs = pool[i*2+1]; + + /* empty entries have two zeros, still have a string id */ + if (pool[i*2] == 0 && refs == 0) + { + i++; + n++; + continue; + }
/* * If a string is over 64k, the previous string entry is made null * and its the high word of the length is inserted in the null string's * reference count field. */ - if( pool[i*2-2] == 0 && pool[i*2-1] ) - len += pool[i*2+1] * 0x10000; - - if( (offset + len) > datasize ) + if( pool[i*2] == 0) { - ERR("string table corrupt?\n"); - break; + len = (pool[i*2+3] << 16) + pool[i*2+2]; + i += 2; + } + else + { + len = pool[i*2]; + i += 1; }
- /* don't add the high word of a string's length as a string */ - if ( len || !pool[i*2+1] ) + if ( (offset + len) > datasize ) { - r = msi_addstring( st, n, data+offset, len, pool[i*2+1] ); - if( r != n ) - ERR("Failed to add string %ld\n", n ); - n++; + ERR("string table corrupt?\n"); + break; }
+ r = msi_addstring( st, n, data+offset, len, refs ); + if( r != n ) + ERR("Failed to add string %ld\n", n ); + n++; offset += len; }
if ( datasize != offset ) - ERR("string table load failed! (%08x != %08lx)\n", datasize, offset ); + ERR("string table load failed! (%08x != %08lx), please report\n", datasize, offset );
TRACE("Loaded %ld strings\n", count);