[Tizen.Core] Fix double free issues (#6335)
authorhjhun <36876573+hjhun@users.noreply.github.com>
Fri, 20 Sep 2024 02:03:54 +0000 (11:03 +0900)
committerGitHub <noreply@github.com>
Fri, 20 Sep 2024 02:03:54 +0000 (11:03 +0900)
* [Tizen.Core] Fix double free issues

The received object in the callback function should not be released.

Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
* Prevent double free using an internal property

Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
---------

Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
src/Tizen.Core/Tizen.Core/ChannelObject.cs
src/Tizen.Core/Tizen.Core/Event.cs
src/Tizen.Core/Tizen.Core/Task.cs

index 64a35b975af9b35449db2111aecd3c9183bb4109..98730fa19527e6c1788729088514f0ade23a9776 100644 (file)
@@ -55,12 +55,14 @@ namespace Tizen.Core
             Id = id;
             Data = data;
             IsUsed = false;
+            IsDestroyable = true;
         }
 
         internal ChannelObject(IntPtr handle)
         {
             _handle = handle;
             IsUsed = false;
+            IsDestroyable = true;
         }
 
         /// <summary>
@@ -128,6 +130,8 @@ namespace Tizen.Core
             }
         }
 
+        internal bool IsDestroyable { set; get; }
+
         internal bool IsUsed { set; get; }
 
         internal IntPtr Handle { get { return _handle; } }
@@ -152,7 +156,10 @@ namespace Tizen.Core
                             _dataMap.TryRemove(id, out var data);
                         }
 
-                        Interop.LibTizenCore.TizenCoreChannel.ObjectDestroy(_handle);
+                        if (IsDestroyable)
+                        {
+                            Interop.LibTizenCore.TizenCoreChannel.ObjectDestroy(_handle);
+                        }
                         _handle = IntPtr.Zero;
                     }
                 }
index d9fc25b184bd3d51df972ab5704af5dc29df10da..b0a473dd5e6964d7f4938a8217968911168a6fc4 100644 (file)
@@ -68,6 +68,7 @@ namespace Tizen.Core
             using (var eventObject = new EventObject(eventData))
             {
                 EventReceived?.Invoke(this, new EventReceivedEventArgs(eventObject));
+                eventObject.Handle = IntPtr.Zero;
             }
             return true;
         }
index 1e8b52299aee80ea4e4b393a38691ca9ad1ac045..0be1f06fd5e4653e29a48d039e9eae8ff55579f2 100644 (file)
@@ -567,6 +567,7 @@ namespace Tizen.Core
                         {
                             var eventArgs = new ChannelReceivedEventArgs(channelObject);
                             receiver.InvokeEventHandler(null, eventArgs);
+                            channelObject.IsDestroyable = false;
                         }
                     }
                 }