[PATCH v3 3/3] msado15: Prevent Multiple Open/Close of a _Recordset.
Alistair Leslie-Hughes
leslie_alistair at hotmail.com
Thu Dec 12 23:12:17 CST 2019
Currently closing twice or Close/Release would cause a crash.
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
---
dlls/msado15/recordset.c | 15 +++++++++++----
dlls/msado15/tests/msado15.c | 3 +++
2 files changed, 14 insertions(+), 4 deletions(-)
diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c
index 9bf6b60df1..0dc8a496c0 100644
--- a/dlls/msado15/recordset.c
+++ b/dlls/msado15/recordset.c
@@ -664,9 +664,12 @@ static void close_recordset( struct recordset *recordset )
{
ULONG row, col, col_count = get_column_count( recordset );
- recordset->fields->recordset = NULL;
- Fields_Release( &recordset->fields->Fields_iface );
- recordset->fields = NULL;
+ if (recordset->fields)
+ {
+ recordset->fields->recordset = NULL;
+ Fields_Release( &recordset->fields->Fields_iface );
+ recordset->fields = NULL;
+ }
for (row = 0; row < recordset->count; row++)
for (col = 0; col < col_count; col++) VariantClear( &recordset->data[row * col_count + col] );
@@ -674,6 +677,7 @@ static void close_recordset( struct recordset *recordset )
recordset->count = recordset->allocated = recordset->index = 0;
heap_free( recordset->data );
recordset->data = NULL;
+ recordset->state = adStateClosed;
}
static ULONG WINAPI recordset_Release( _Recordset *iface )
@@ -916,8 +920,9 @@ static HRESULT WINAPI recordset_Close( _Recordset *iface )
TRACE( "%p\n", recordset );
+ if (recordset->state == adStateClosed) return MAKE_ADO_HRESULT( adErrObjectClosed );
+
close_recordset( recordset );
- recordset->state = adStateClosed;
return S_OK;
}
@@ -971,6 +976,8 @@ static HRESULT WINAPI recordset_Open( _Recordset *iface, VARIANT source, VARIANT
FIXME( "%p, %s, %s, %d, %d, %d\n", recordset, debugstr_variant(&source), debugstr_variant(&active_connection),
cursor_type, lock_type, options );
+ if (recordset->state == adStateOpen) return MAKE_ADO_HRESULT( adErrObjectOpen );
+
recordset->state = adStateOpen;
return S_OK;
}
diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c
index 1fae811d10..b80600a676 100644
--- a/dlls/msado15/tests/msado15.c
+++ b/dlls/msado15/tests/msado15.c
@@ -96,6 +96,9 @@ static void test_Recordset(void)
ok(hr == S_OK, "Failed to get ISupportErrorInfo interface\n");
ISupportErrorInfo_Release(errorinfo);
+ hr = _Recordset_Close( recordset );
+ ok( hr == MAKE_ADO_HRESULT( adErrObjectClosed ), "got %08x\n", hr );
+
refs = _Recordset_Release( recordset );
ok( !refs, "got %d\n", refs );
--
2.17.1
More information about the wine-devel
mailing list