Skip to content

Commit 08dc25f

Browse files
committed
Simplest fix for #8185: SIGSEGV in Firebird 5.0.0.1306 embedded during update on cursor - disallow caching for positioned updates/deletes
1 parent b056f5b commit 08dc25f

File tree

2 files changed

+7
-1
lines changed

2 files changed

+7
-1
lines changed

src/dsql/DsqlRequests.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,8 @@ void DsqlRequest::destroy(thread_db* tdbb, DsqlRequest* dsqlRequest)
177177
{
178178
childStatement->addFlags(DsqlStatement::FLAG_ORPHAN);
179179
childStatement->setParentRequest(nullptr);
180+
childStatement->setParentDbKey(nullptr);
181+
childStatement->setParentRecVersion(nullptr);
180182

181183
// hvlad: lines below is commented out as
182184
// - child is already unlinked from its parent request

src/dsql/dsql.cpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -620,7 +620,11 @@ static RefPtr<DsqlStatement> prepareStatement(thread_db* tdbb, dsql_dbb* databas
620620
if (!isInternalRequest && dsqlStatement->mustBeReplicated())
621621
dsqlStatement->setOrgText(text, textLength);
622622

623-
if (isStatementCacheActive && dsqlStatement->isDml())
623+
const bool basedOnCursor =
624+
(dsqlStatement->getType() & (DsqlStatement::TYPE_UPDATE_CURSOR |
625+
DsqlStatement::TYPE_DELETE_CURSOR));
626+
627+
if (isStatementCacheActive && dsqlStatement->isDml() && !basedOnCursor)
624628
{
625629
database->dbb_statement_cache->putStatement(tdbb,
626630
textStr, clientDialect, isInternalRequest, dsqlStatement);

0 commit comments

Comments
 (0)