Currently closing twice or Close/Release would cause a crash. Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)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