From 9559f579e688b38ab59a66152fec0b76106d3756 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Tue, 17 Jun 2014 11:49:20 -0400 Subject: [PATCH] Variant: Fix crash when casting a Variant to string If we don't pass NULL to the length argument it makes C code write the length at random places in memory and bad things happens. --- glib/Variant.cs | 6 +++--- sample/VariantDemo.cs | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/glib/Variant.cs b/glib/Variant.cs index cce7bcbc7..b4051016c 100644 --- a/glib/Variant.cs +++ b/glib/Variant.cs @@ -283,12 +283,12 @@ namespace GLib { } [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] - static extern IntPtr g_variant_get_string (IntPtr handle); + static extern IntPtr g_variant_get_string (IntPtr handle, IntPtr length); public static explicit operator string (Variant val) { - IntPtr str = g_variant_get_string (val.Handle); - return str == IntPtr.Zero ? null : GLib.Marshaller.Utf8PtrToString (str); + IntPtr str = g_variant_get_string (val.Handle, IntPtr.Zero); + return GLib.Marshaller.Utf8PtrToString (str); } [DllImport (Global.GLibNativeDll, CallingConvention = CallingConvention.Cdecl)] diff --git a/sample/VariantDemo.cs b/sample/VariantDemo.cs index 1c3b47c61..d9a586fec 100644 --- a/sample/VariantDemo.cs +++ b/sample/VariantDemo.cs @@ -27,6 +27,7 @@ namespace sample var dict = new Dictionary (); dict.Add ("strv", new Variant (strv)); dict.Add ("unit", Variant.NewTuple (null)); + dict.Add ("str", new Variant ("String 6")); variant = new Variant (dict); Console.WriteLine (variant.Print (true)); @@ -35,6 +36,11 @@ namespace sample Console.WriteLine ("unit: " + asv["unit"].Print(true)); Console.WriteLine ("type: " + variant.Type.ToString ()); + + Variant tmp; + asv.TryGetValue ("str", out tmp); + var str = (string) tmp; + Console.WriteLine ("out str " + str); } public static void Main (string[] args)