From 3b7d6d21e23c92eb40256a91c259b3b4aa6075f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Van=20Canneyt?= Date: Sat, 23 Dec 2023 23:11:25 +0100 Subject: [PATCH] * Fix AV when freeing transactions. Reported by Pascal Riekenberg. Fixes issuu #40571 --- packages/fcl-db/src/base/database.inc | 19 +++++++++---------- packages/fcl-db/src/sqldb/sqldb.pp | 12 ++++++++++-- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/packages/fcl-db/src/base/database.inc b/packages/fcl-db/src/base/database.inc index 0a7dfc168f..6f7106ed15 100644 --- a/packages/fcl-db/src/base/database.inc +++ b/packages/fcl-db/src/base/database.inc @@ -454,15 +454,14 @@ end; procedure TDBTransaction.SetDatabase(Value: TDatabase); begin - If Value<>FDatabase then - begin - CheckInactive; - If Assigned(FDatabase) then - FDatabase.UnregisterTransaction(Self); - If Value<>Nil Then - Value.RegisterTransaction(Self); - FDatabase:=Value; - end; + If Value=FDatabase then + exit; + CheckInactive; + If Assigned(FDatabase) then + FDatabase.UnregisterTransaction(Self); + If Value<>Nil Then + Value.RegisterTransaction(Self); + FDatabase:=Value; end; constructor TDBTransaction.Create(AOwner: TComponent); @@ -523,9 +522,9 @@ end; destructor TDBTransaction.Destroy; begin - Database:=Nil; CloseDataSets; RemoveDatasets; + Database:=Nil; FDatasets.Free; Inherited; end; diff --git a/packages/fcl-db/src/sqldb/sqldb.pp b/packages/fcl-db/src/sqldb/sqldb.pp index 4899246071..c8ff3f31c8 100644 --- a/packages/fcl-db/src/sqldb/sqldb.pp +++ b/packages/fcl-db/src/sqldb/sqldb.pp @@ -2518,13 +2518,21 @@ Const var Q : TSQLQuery; + C : TSQLConnection; begin Q:=DS as TSQLQuery; if not (sqoKeepOpenOnCommit in Q.Options) then inherited CloseDataset(Q,InCommit); - if UnPrepOptions[InCommit] in SQLConnection.ConnOptions then - Q.UnPrepare; + C:=SQLConnection; + if C=Nil then + C:=Q.SQLConnection; + if Q.Prepared then + if not Assigned(C) then + // No database, we must unprepare... + Q.UnPrepare // Unprepare checks if there is still a cursor. + else if UnPrepOptions[InCommit] in C.ConnOptions then + Q.UnPrepare; end; procedure TSQLTransaction.Commit;