From: Hans Leidekker Subject: [PATCH 8/8] msado15: Prevent multiple Open/Close of a _Recordset. Message-Id: <20191213145231.18675-8-hans@codeweavers.com> Date: Fri, 13 Dec 2019 15:52:31 +0100 Based on a patch by Alistair Leslie-Hughes. Signed-off-by: Hans Leidekker --- dlls/msado15/recordset.c | 5 +++++ dlls/msado15/tests/msado15.c | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c index 56cdee6652..1d28d6b957 100644 --- a/dlls/msado15/recordset.c +++ b/dlls/msado15/recordset.c @@ -1035,6 +1035,8 @@ 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; @@ -1106,6 +1108,9 @@ 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->fields) return MAKE_ADO_HRESULT( adErrInvalidConnection ); + 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 a3bce0b471..cba3d5fafc 100644 --- a/dlls/msado15/tests/msado15.c +++ b/dlls/msado15/tests/msado15.c @@ -114,6 +114,9 @@ static void test_Recordset(void) ok( hr == S_OK, "got %08x\n", hr ); ok( !count, "got %d\n", count ); + hr = _Recordset_Close( recordset ); + ok( hr == MAKE_ADO_HRESULT( adErrObjectClosed ), "got %08x\n", hr ); + refs = _Recordset_Release( recordset ); ok( !refs, "got %d\n", refs ); @@ -135,7 +138,7 @@ static void test_Recordset(void) V_VT( &missing ) = VT_ERROR; V_ERROR( &missing ) = DISP_E_PARAMNOTFOUND; hr = _Recordset_Open( recordset, missing, missing, adOpenStatic, adLockBatchOptimistic, adCmdUnspecified ); - todo_wine ok( hr == MAKE_ADO_HRESULT( adErrInvalidConnection ), "got %08x\n", hr ); + ok( hr == MAKE_ADO_HRESULT( adErrInvalidConnection ), "got %08x\n", hr ); hr = _Recordset_get_Fields( recordset, &fields ); ok( hr == S_OK, "got %08x\n", hr ); @@ -155,6 +158,9 @@ static void test_Recordset(void) ok( is_eof( recordset ), "not eof\n" ); ok( is_bof( recordset ), "not bof\n" ); + hr = _Recordset_Open( recordset, missing, missing, adOpenStatic, adLockBatchOptimistic, adCmdUnspecified ); + ok( hr == MAKE_ADO_HRESULT( adErrObjectOpen ), "got %08x\n", hr ); + state = -1; hr = _Recordset_get_State( recordset, &state ); ok( hr == S_OK, "got %08x\n", hr ); -- 2.20.1