mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-23 00:03:02 +01:00
Fixed CORE-4794: isc_cancel_events returns error invalid events id (handle) (code: 335545021) if event is (no longer) queued
This commit is contained in:
parent
eb53fc3b1f
commit
867ef82872
@ -1718,8 +1718,21 @@ ISC_STATUS API_ROUTINE isc_cancel_events(ISC_STATUS* userStatus, FB_API_HANDLE*
|
||||
try
|
||||
{
|
||||
RefPtr<YAttachment> attachment(translateHandle(attachments, handle));
|
||||
// This cast appears awful, but as long as handles are 32-bit entities it's OK.
|
||||
RefPtr<YEvents> event(translateHandle(events, (FB_API_HANDLE*) id));
|
||||
RefPtr<YEvents> event;
|
||||
try
|
||||
{
|
||||
// This cast appears awful, but as long as handles are 32-bit entities it's OK.
|
||||
event = translateHandle(events, (FB_API_HANDLE*) id);
|
||||
}
|
||||
catch(const Firebird::status_exception& ex)
|
||||
{
|
||||
if (ex.value()[1] == isc_bad_events_handle)
|
||||
{
|
||||
// Ignore invalid handle/ID in cancelation call for backward compatibility
|
||||
return status[1];
|
||||
}
|
||||
throw;
|
||||
}
|
||||
|
||||
if (event->attachment != attachment)
|
||||
Arg::Gds(isc_bad_events_handle).raise();
|
||||
@ -2823,8 +2836,6 @@ ISC_STATUS API_ROUTINE isc_wait_for_event(ISC_STATUS* userStatus, FB_API_HANDLE*
|
||||
{
|
||||
RefPtr<YAttachment> attachment(translateHandle(attachments, dbHandle));
|
||||
|
||||
///nullCheck(id, isc_bad_events_handle);
|
||||
|
||||
events = attachment->queEvents(&statusWrapper, callback, length, eventsData);
|
||||
|
||||
if (status.getState() & Firebird::IStatus::STATE_ERRORS)
|
||||
@ -2916,8 +2927,6 @@ ISC_STATUS API_ROUTINE isc_que_events(ISC_STATUS* userStatus, FB_API_HANDLE* dbH
|
||||
{
|
||||
RefPtr<YAttachment> attachment(translateHandle(attachments, dbHandle));
|
||||
|
||||
///nullCheck(idFB_FINAL , isc_bad_events_handle);
|
||||
|
||||
RefPtr<QueCallback> callback(new QueCallback(ast, arg));
|
||||
events = attachment->queEvents(&statusWrapper, callback, length, eventsData);
|
||||
callback->setEvents(events); // should be called in case of NULL events too
|
||||
|
Loading…
Reference in New Issue
Block a user