From: John Darrington <john@darrington.wattle.id.au>
Date: Sat, 4 Jul 2020 09:11:47 +0000 (+0200)
Subject: Value variant: Don't over allocate string values
X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=afb3e3afa5ee6bc26d118e20e277eb03ddc6fac5;p=pspp

Value variant: Don't over allocate string values
---

diff --git a/src/ui/gui/value-variant.c b/src/ui/gui/value-variant.c
index f332ccff11..ef40935a8f 100644
--- a/src/ui/gui/value-variant.c
+++ b/src/ui/gui/value-variant.c
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2016  Free Software Foundation
+   Copyright (C) 2016, 2020  Free Software Foundation
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -42,11 +42,10 @@ value_variant_new (const union value *in, int width)
     vv[IDX_DATA] = g_variant_new_double (in->f);
   else
     {
-      gchar *q = xmalloc (width + 1);
+      gchar *q = xmalloc (width);
       memcpy (q, in->s, width);
-      q[width] = '\0';
-      vv[IDX_DATA] = g_variant_new_from_data (G_VARIANT_TYPE_BYTESTRING, q,
-					      width + 1, FALSE, NULL, NULL);
+      vv[IDX_DATA] = g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE,
+                                                q, width, sizeof (gchar));
     }
 
   return g_variant_new_tuple (vv, 2);
@@ -79,9 +78,11 @@ value_variant_get (union value *val, GVariant *v)
     val->f = g_variant_get_double (vdata);
   else
     {
-      const gchar *data = g_variant_get_bytestring (vdata);
-      size_t len = strlen (data);
-      val->s = xmemdup (data, MIN (width, len));
+      gsize w;
+      const gchar *data = g_variant_get_fixed_array (vdata, &w, sizeof (gchar));
+      if (w != width)
+        g_critical ("Value variant's width does not match its array size");
+      val->s = xmemdup (data, w);
     }
 
   g_variant_unref (vdata);