win32: fix g_get_environ()
authorMarc-André Lureau <marcandre.lureau@gmail.com>
Mon, 9 Jul 2012 01:54:55 +0000 (03:54 +0200)
committerMarc-André Lureau <marcandre.lureau@gmail.com>
Mon, 16 Jul 2012 10:49:24 +0000 (12:49 +0200)
The current code create the strv array incorrectly, it is too big and
leaves invalid holes. This may result in crashes when freeing the
returned value.

https://bugzilla.gnome.org/show_bug.cgi?id=679617

glib/genviron.c

index 59a8bbe..4abf776 100644 (file)
@@ -633,10 +633,15 @@ g_get_environ (void)
   gint i, n;
 
   strings = GetEnvironmentStringsW ();
-  for (n = 0; strings[n]; n += wcslen (strings + n) + 1);
-  result = g_new (char *, n + 1);
-  for (i = 0; strings[i]; i += wcslen (strings + i) + 1)
-    result[i] = g_utf16_to_utf8 (strings + i, -1, NULL, NULL, NULL);
+  for (n = 0, i = 0; strings[n]; i++)
+    n += wcslen (strings + n) + 1;
+
+  result = g_new (char *, i + 1);
+  for (n = 0, i = 0; strings[n]; i++)
+    {
+      result[i] = g_utf16_to_utf8 (strings + n, -1, NULL, NULL, NULL);
+      n += wcslen (strings + n) + 1;
+    }
   FreeEnvironmentStringsW (strings);
   result[i] = NULL;