Allocate 2 instead of 1 byte per char for buffer used in WinGLNative.HandleDropFiles
authorUnknownShadow200 <unknownshadow200@gmail.com>
Sat, 5 Aug 2017 13:56:42 +0000 (23:56 +1000)
committerGitHub <noreply@github.com>
Sat, 5 Aug 2017 13:56:42 +0000 (23:56 +1000)
DragQueryFile returns number of characters. Previously, a buffer of 'number of characters' bytes was being allocated.

This change fixes crashing when the platform uses a character set with more than one byte per character. (unicode charset has 2 bytes)

Fixes #626

src/OpenTK/Platform/Windows/WinGLNative.cs

index 460b24f..5b31bac 100644 (file)
@@ -692,10 +692,11 @@ namespace OpenTK.Platform.Windows
             for (uint i = 0; i < filesCounter; ++i)
             {
                 // Don't forget about \0 at the end
-                uint fileNameSize = Functions.DragQueryFile(hDrop, i, IntPtr.Zero, 0) + 1;
-                IntPtr str = Marshal.AllocHGlobal((int)fileNameSize);
+                uint filenameChars = Functions.DragQueryFile(hDrop, i, IntPtr.Zero, 0) + 1;
+                int filenameSize = (int)(filenameChars * 2); // for unicode char set, 2 bytes per character
+                IntPtr str = Marshal.AllocHGlobal(filenameSize);
 
-                Functions.DragQueryFile(hDrop, i, str, fileNameSize);
+                Functions.DragQueryFile(hDrop, i, str, filenameChars);
 
                 string dropString = Marshal.PtrToStringAuto(str);
                 OnFileDrop(dropString);