From: Francois Gouget fgouget@codeweavers.com
err must be set if the last attempt to allocate the tables fails.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=54328 --- dlls/nsi/nsi.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/dlls/nsi/nsi.c b/dlls/nsi/nsi.c index 345dce6dfe6..ba1597e13a9 100644 --- a/dlls/nsi/nsi.c +++ b/dlls/nsi/nsi.c @@ -66,10 +66,11 @@ DWORD WINAPI NsiAllocateAndGetTable( DWORD unk, const NPI_MODULEID *module, DWOR data[2], sizes[2], data[3], sizes[3], &num ); if (err != ERROR_MORE_DATA) break; TRACE( "Short buffer, attempt %d.\n", attempt ); + err = NsiEnumerateObjectsAllParameters( unk, 0, module, table, NULL, 0, NULL, 0, NULL, 0, NULL, 0, &num ); + if (err) goto err; NsiFreeTable( data[0], data[1], data[2], data[3] ); memset( data, 0, sizeof(data) ); - err = NsiEnumerateObjectsAllParameters( unk, 0, module, table, NULL, 0, NULL, 0, NULL, 0, NULL, 0, &num ); - if (err) return err; + err = ERROR_OUTOFMEMORY; /* fail if this is the last attempt */ }
if (!err) @@ -79,10 +80,11 @@ DWORD WINAPI NsiAllocateAndGetTable( DWORD unk, const NPI_MODULEID *module, DWOR if (sizes[2]) *dynamic_data = data[2]; if (sizes[3]) *static_data = data[3]; *count = num; + return NO_ERROR; }
err: - if (err) NsiFreeTable( data[0], data[1], data[2], data[3] ); + NsiFreeTable( data[0], data[1], data[2], data[3] ); return err; }