From 2dfbf474d04cd8d06fafac8663904b0b59b746a8 Mon Sep 17 00:00:00 2001 From: Noethix55555 <277300782+Noethix55555@users.noreply.github.com> Date: Wed, 17 Jun 2026 22:27:09 -0400 Subject: [PATCH] fix: wrap CommandV allocations in try/finally to prevent memory leaks --- src/MpvNet/MpvClient.cs | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/MpvNet/MpvClient.cs b/src/MpvNet/MpvClient.cs index a4890a48..b0262216 100644 --- a/src/MpvNet/MpvClient.cs +++ b/src/MpvNet/MpvClient.cs @@ -227,24 +227,30 @@ public void CommandV(params string[] args) IntPtr[] pointers = new IntPtr[count]; IntPtr rootPtr = Marshal.AllocHGlobal(IntPtr.Size * count); - for (int index = 0; index < args.Length; index++) + try { - var bytes = GetUtf8Bytes(args[index]); - IntPtr ptr = Marshal.AllocHGlobal(bytes.Length); - Marshal.Copy(bytes, 0, ptr, bytes.Length); - pointers[index] = ptr; - } - - Marshal.Copy(pointers, 0, rootPtr, count); - mpv_error err = mpv_command(Handle, rootPtr); + for (int index = 0; index < args.Length; index++) + { + var bytes = GetUtf8Bytes(args[index]); + IntPtr ptr = Marshal.AllocHGlobal(bytes.Length); + Marshal.Copy(bytes, 0, ptr, bytes.Length); + pointers[index] = ptr; + } - foreach (IntPtr ptr in pointers) - Marshal.FreeHGlobal(ptr); + Marshal.Copy(pointers, 0, rootPtr, count); + mpv_error err = mpv_command(Handle, rootPtr); - Marshal.FreeHGlobal(rootPtr); + if (err < 0) + HandleError(err, "error executing command: " + string.Join("\n", args)); + } + finally + { + foreach (IntPtr ptr in pointers) + if (ptr != IntPtr.Zero) + Marshal.FreeHGlobal(ptr); - if (err < 0) - HandleError(err, "error executing command: " + string.Join("\n", args)); + Marshal.FreeHGlobal(rootPtr); + } } public string Expand(string? value)