[Tdbc] Fix UpdateHookCallback released issue (#5528)
authorChangGyu Choi <changyu.choi@samsung.com>
Thu, 12 Oct 2023 00:13:23 +0000 (09:13 +0900)
committerJay Cho <chojoong@gmail.com>
Fri, 27 Oct 2023 02:52:43 +0000 (11:52 +0900)
The issue is that if you don't keep a reference to the UpdateHookCallback,
it may be garbage collected before it is used.

UpdateHookCallback should be referenced during used this.

Signed-off-by: Changgyu Choi <changyu.choi@samsung.com>
Co-authored-by: pjh9216 <jh9216.park@samsung.com>
src/Tizen.Data.Tdbc.Driver.Sqlite/Tizen.Data.Tdbc.Driver.Sqlite/Connection.cs

index b1463f6..5518e21 100644 (file)
@@ -28,7 +28,7 @@ namespace Tizen.Data.Tdbc.Driver.Sqlite
         private bool disposedValue;
         private readonly object _lock = new object();
         private EventHandler<RecordChangedEventArgs> _recordChanged;
-
+        private Interop.Sqlite.UpdateHookCallback _hook;
 
         static Connection()
         {
@@ -70,6 +70,7 @@ namespace Tizen.Data.Tdbc.Driver.Sqlite
                 Interop.Sqlite.UpdateHook(_db, null, IntPtr.Zero);
                 Interop.Sqlite.Close(_db);
                 _opened = false;
+                _hook = null;
             }
         }
 
@@ -154,7 +155,12 @@ namespace Tizen.Data.Tdbc.Driver.Sqlite
             if (ret != (int)Interop.Sqlite.ResultCode.SQLITE_OK)
                 throw new InvalidOperationException("code:" + ret);
 
-            Interop.Sqlite.UpdateHook(_db, UpdateHookCallback, IntPtr.Zero);
+            if (_hook == null)
+            {
+                _hook = new Interop.Sqlite.UpdateHookCallback(UpdateHookCallback);
+            }
+
+            Interop.Sqlite.UpdateHook(_db, _hook, IntPtr.Zero);
             _opened = true;
         }