[libvirt] [PATCH C#] Fix two memory leaks in the ConnectCredential.Result setter

Matthias Bolte matthias.bolte at googlemail.com
Thu Oct 28 10:38:17 UTC 2010


StringToHGlobalAnsi returns a pointer to unmanaged memory that
must be freed using FreeHGlobal.

When the setter is called twice the strdup'ed unmanaged string
from the first call leaks. Free it before assigning it again.
---
 NativeFunctions.cs                              |    6 +++++-
 Types.cs                                        |   13 +++++++++++--
 projects/MonoDevelop/LibvirtBindings.dll.config |    2 ++
 3 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/NativeFunctions.cs b/NativeFunctions.cs
index 25d7532..71136b8 100644
--- a/NativeFunctions.cs
+++ b/NativeFunctions.cs
@@ -16,8 +16,12 @@ namespace Libvirt
 {
     public class NativeFunctions
     {
-        // TODO : this is atemporary workaround for virConnectOpenAuth callback, this should be removed
+        // TODO : this is a temporary workaround for virConnectOpenAuth callback, this should be removed
         [DllImport("msvcrt.dll", EntryPoint = "_strdup", CallingConvention = CallingConvention.Cdecl)]
         public static extern IntPtr StrDup(IntPtr strSource);
+
+        // TODO : this is a temporary workaround for virConnectOpenAuth callback, this should be removed
+        [DllImport("msvcrt.dll", EntryPoint = "free", CallingConvention = CallingConvention.Cdecl)]
+        public static extern void Free(IntPtr ptr);
     }
 }
diff --git a/Types.cs b/Types.cs
index 0d471fb..37a1f47 100644
--- a/Types.cs
+++ b/Types.cs
@@ -1,4 +1,4 @@
-/*
+/*
  * Copyright (C)
  *   Arnaud Champion <arnaud.champion at devatom.fr>
  *   Jaromír Červenka <cervajz at cervajz.com>
@@ -406,6 +406,10 @@ namespace Libvirt
     [StructLayout(LayoutKind.Sequential)]
     public class ConnectCredential
     {
+        public ConnectCredential ()
+        {
+            result = IntPtr.Zero;
+        }
         ///<summary>
         /// One of virConnectCredentialType constants
         ///</summary>
@@ -473,8 +477,13 @@ namespace Libvirt
             }
             set
             {
-                result = NativeFunctions.StrDup(Marshal.StringToHGlobalAnsi(value));
+                IntPtr tmp = Marshal.StringToHGlobalAnsi(value);
+
+                NativeFunctions.Free(result);
+                result = NativeFunctions.StrDup(tmp);
                 resultlen = (uint)value.Length;
+
+                Marshal.FreeHGlobal(tmp);
             }
         }
     }
diff --git a/projects/MonoDevelop/LibvirtBindings.dll.config b/projects/MonoDevelop/LibvirtBindings.dll.config
index d0ded4c..2dfa2e4 100644
--- a/projects/MonoDevelop/LibvirtBindings.dll.config
+++ b/projects/MonoDevelop/LibvirtBindings.dll.config
@@ -6,6 +6,8 @@
 	</dllmap>
 	<dllmap dll="msvcrt.dll">
 		<dllentry os="windows" dll="msvcrt.dll" name="_strdup" target="_strdup" />
+		<dllentry os="windows" dll="msvcrt.dll" name="free" target="free" />
 		<dllentry os="linux" dll="libc.so.6" name="_strdup" target="strdup" />
+		<dllentry os="linux" dll="libc.so.6" name="free" target="free" />
 	</dllmap>
 </configuration>
-- 
1.7.0.4




More information about the libvir-list mailing list