glib/gtimezone.c: Check the size of tzi.DaylightName
authorChun-wei Fan <fanchunwei@src.gnome.org>
Tue, 7 Jan 2014 05:34:09 +0000 (13:34 +0800)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 20 Jan 2014 15:22:47 +0000 (10:22 -0500)
We need to re-get the size of tzi.DaylightName before we call
RegQueryValue() because the buffer might not have enough room to hold the
value for tzi.DaylightName that would be acquired by RegQueryValueExA(),
even though the size of tzi.DaylightName and tzi.StandardName is the same.

This is a pitfall of RegQueryValue()[1] as not doing this can result in an
ERROR_MORE_DATA (234) failure, causing the acquisition of tzi.DaylightName
to fail.

This will fix the gdatetime/equal test, amongst some other tests in
gdatetime, at least on certain non-English version of Windows.

[1]: http://social.msdn.microsoft.com/Forums/vstudio/en-US/84f90854-e90c-4b63-8fc1-655a0b4645fd/regqueryvalueex-returns-errormoredata

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

glib/gtimezone.c

index f93c82540256eb6e4c1dfefc326b916193dd8282..256ac80bbb1ff57f63df2c1274a70d82d290b20a 100644 (file)
@@ -664,6 +664,9 @@ rules_from_windows_time_zone (const gchar *identifier, TimeZoneRule **rules)
   if (RegQueryValueExA (key, "Std", NULL, NULL,
                         (LPBYTE)&(tzi.StandardName), &size) != ERROR_SUCCESS)
     goto failed;
+
+  size = sizeof tzi.DaylightName;
+
   if (RegQueryValueExA (key, "Dlt", NULL, NULL,
                         (LPBYTE)&(tzi.DaylightName), &size) != ERROR_SUCCESS)
     goto failed;