Permalink
Browse files

Fixes bugs in String marshalling.

Fixes two issues:
1. FreeStringArrayPtr used the wrong variable in the offset to
ReadIntPtr causing an access violation.
2. Better cleanup of memory in MarshalStringArrayToPtr when any alloc
fails.
  • Loading branch information...
1 parent b9e9485 commit 22760a4032776fb2afbb99fa59d641d216c83811 @Frassle Frassle committed Jun 19, 2014
Showing with 19 additions and 4 deletions.
  1. +19 −4 Source/OpenTK/BindingsBase.cs
@@ -202,10 +202,25 @@ protected static IntPtr MarshalStringArrayToPtr(string[] str_array)
throw new OutOfMemoryException();
}
- for (int i = 0; i < str_array.Length; i++)
+ int i = 0;
+ try
{
- IntPtr str = MarshalStringToPtr(str_array[i]);
- Marshal.WriteIntPtr(ptr, i * IntPtr.Size, str);
+ for (i = 0; i < str_array.Length; i++)
+ {
+ IntPtr str = MarshalStringToPtr(str_array[i]);
+ Marshal.WriteIntPtr(ptr, i * IntPtr.Size, str);
+ }
+ }
+ catch (OutOfMemoryException oom)
+ {
+ for (i = i - 1; i >= 0; --i)
+ {
+ Marshal.FreeHGlobal(Marshal.ReadIntPtr(ptr, i * IntPtr.Size));
+ }
+
+ Marshal.FreeHGlobal(ptr);
+
+ throw oom;
}
}
return ptr;
@@ -220,7 +235,7 @@ protected static void FreeStringArrayPtr(IntPtr ptr, int length)
{
for (int i = 0; i < length; i++)
{
- Marshal.FreeHGlobal(Marshal.ReadIntPtr(ptr, length * IntPtr.Size));
+ Marshal.FreeHGlobal(Marshal.ReadIntPtr(ptr, i * IntPtr.Size));
}
Marshal.FreeHGlobal(ptr);
}

0 comments on commit 22760a4

Please sign in to comment.