regex: Don't return from inside a g_once_init_enter/leave block
authorChristian Persch <chpe@gnome.org>
Thu, 7 Jun 2012 14:07:04 +0000 (16:07 +0200)
committerChristian Persch <chpe@gnome.org>
Mon, 2 Jul 2012 13:59:38 +0000 (15:59 +0200)
When using the system PCRE, and it was compiled with incompatible options,
the code was returning from inside a g_once_init_enter/leave block without
calling g_once_init_leave().

glib/gregex.c

index 7dc7abb..efb2d57 100644 (file)
@@ -1261,7 +1261,7 @@ g_regex_new (const gchar         *pattern,
   gint erroffset;
   gint errcode;
   gboolean optimize = FALSE;
-  static gsize initialised;
+  static volatile gsize initialised = 0;
   unsigned long int pcre_compile_options;
 
   g_return_val_if_fail (pattern != NULL, NULL);
@@ -1271,28 +1271,24 @@ g_regex_new (const gchar         *pattern,
 
   if (g_once_init_enter (&initialised))
     {
-      gint support;
-      const gchar *msg;
+      int supports_utf8, supports_ucp;
 
-      pcre_config (PCRE_CONFIG_UTF8, &support);
-      if (!support)
-        {
-          msg = N_("PCRE library is compiled without UTF8 support");
-          g_critical ("%s", msg);
-          g_set_error_literal (error, G_REGEX_ERROR, G_REGEX_ERROR_COMPILE, gettext (msg));
-          return NULL;
-        }
+      pcre_config (PCRE_CONFIG_UTF8, &supports_utf8);
+      if (!supports_utf8)
+        g_critical (_("PCRE library is compiled without UTF8 support"));
 
-      pcre_config (PCRE_CONFIG_UNICODE_PROPERTIES, &support);
-      if (!support)
-        {
-          msg = N_("PCRE library is compiled without UTF8 properties support");
-          g_critical ("%s", msg);
-          g_set_error_literal (error, G_REGEX_ERROR, G_REGEX_ERROR_COMPILE, gettext (msg));
-          return NULL;
-        }
+      pcre_config (PCRE_CONFIG_UNICODE_PROPERTIES, &supports_ucp);
+      if (!supports_ucp)
+        g_critical (_("PCRE library is compiled without UTF8 properties support"));
+
+      g_once_init_leave (&initialised, supports_utf8 && supports_ucp ? 1 : 2);
+    }
 
-      g_once_init_leave (&initialised, TRUE);
+  if (G_UNLIKELY (initialised != 1)) 
+    {
+      g_set_error_literal (error, G_REGEX_ERROR, G_REGEX_ERROR_COMPILE, 
+                           _("PCRE library is compiled with incompatible options"));
+      return NULL;
     }
 
   /* G_REGEX_OPTIMIZE has the same numeric value of PCRE_NO_UTF8_CHECK,