[PATCH v3 1/2] msado15: Free field objects in recordset close.

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Sat Mar 20 05:44:54 CDT 2021


This corrects the field reference counter to work for wine but isn't exactly
the same as windows.

Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
---
 dlls/msado15/recordset.c     |  6 ++++++
 dlls/msado15/tests/msado15.c | 12 ++++++++----
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c
index 0bd6b7ed61c..e2f2e6407fd 100644
--- a/dlls/msado15/recordset.c
+++ b/dlls/msado15/recordset.c
@@ -462,6 +462,7 @@ static HRESULT Field_create( const WCHAR *name, LONG index, struct recordset *re
     }
     field->index = index;
     field->recordset = recordset;
+    field->refs = 1;
 
     *obj = &field->Field_iface;
     TRACE( "returning iface %p\n", *obj );
@@ -859,6 +860,7 @@ static ULONG WINAPI recordset_AddRef( _Recordset *iface )
 static void close_recordset( struct recordset *recordset )
 {
     ULONG row, col, col_count;
+    ULONG i;
 
     if ( recordset->row_set ) IRowset_Release( recordset->row_set );
     recordset->row_set = NULL;
@@ -866,6 +868,10 @@ static void close_recordset( struct recordset *recordset )
     if (!recordset->fields) return;
     col_count = get_column_count( recordset );
 
+    for (i=0; i < recordset->fields->count; i++)
+        Field_Release( recordset->fields->field[i] );
+    recordset->fields->count = 0;
+
     Fields_Release( &recordset->fields->Fields_iface );
     recordset->fields = NULL;
 
diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c
index 4de75102e12..28d5412297d 100644
--- a/dlls/msado15/tests/msado15.c
+++ b/dlls/msado15/tests/msado15.c
@@ -286,6 +286,10 @@ static void test_Recordset(void)
     ok( hr == S_OK, "got %08x\n", hr );
     ok( state == adStateClosed, "got %d\n", state );
 
+    count = -1;
+    hr = Fields_get_Count( fields2, &count );
+    ok( !count , "got %d\n", count );
+
     Field_Release( field );
     Fields_Release( fields );
     _Recordset_Release( recordset );
@@ -697,7 +701,7 @@ static void test_Fields(void)
     hr = Fields_get_Item( fields, index, &field );
     ok( hr == S_OK, "got %08x\n", hr );
     refs = get_refs_field( field );
-    ok( refs == 1, "got %d\n", refs );
+    todo_wine ok( refs == 1, "got %d\n", refs );
     refs = get_refs_recordset( recordset );
     ok( refs == 2, "got %d\n", refs );
     refs = get_refs_fields( fields );
@@ -708,7 +712,7 @@ static void test_Fields(void)
     ok( hr == S_OK, "got %08x\n", hr );
     ok( field2 == field, "expected same object\n" );
     refs = get_refs_field( field2 );
-    ok( refs == 2, "got %d\n", refs );
+    todo_wine ok( refs == 2, "got %d\n", refs );
     refs = get_refs_recordset( recordset );
     ok( refs == 2, "got %d\n", refs );
     refs = get_refs_fields( fields );
@@ -721,10 +725,10 @@ static void test_Fields(void)
     hr = Field_QueryInterface( field, &IID_ISupportErrorInfo, (void **)&errorinfo );
     ok( hr == S_OK, "got %08x\n", hr );
     refs = get_refs_field( field );
-    ok( refs == 2, "got %d\n", refs );
+    todo_wine ok( refs == 2, "got %d\n", refs );
     if (errorinfo) ISupportErrorInfo_Release( errorinfo );
     refs = get_refs_field( field );
-    ok( refs == 1, "got %d\n", refs );
+    todo_wine ok( refs == 1, "got %d\n", refs );
 
     /* verify values set with _Append */
     hr = Field_get_Name( field, &name );
-- 
2.30.1




More information about the wine-devel mailing list