]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb: fix ui-style regex initializing order
authorZENG Hao <c@cyano.cn>
Fri, 18 Apr 2025 22:41:28 +0000 (06:41 +0800)
committerTom Tromey <tromey@adacore.com>
Tue, 22 Apr 2025 14:46:00 +0000 (08:46 -0600)
This fixes a crash on Windows NT 4.0, where windows-nat failed dynamic loading
some Win32 functions and print a warning message with styled string, which
depends on ui-style regex. By using `compiled_regex` constructor, the regex is
guaranteed to be initialized before `_initialize_xxx` functions.

Approved-By: Tom Tromey <tom@tromey.com>
gdb/ui-style.c

index b8321c5e42453eb4b205282192842d7457eee562..b8d73abdc8730c2858bf5e982847541cd2d282d0 100644 (file)
@@ -45,7 +45,8 @@ static const char ansi_regex_text[] =
 
 /* The compiled form of ansi_regex_text.  */
 
-static regex_t ansi_regex;
+static compiled_regex ansi_regex (ansi_regex_text, REG_EXTENDED,
+  _("Error in ANSI terminal escape sequences regex"));
 
 /* This maps 8-color palette to RGB triples.  The values come from
    plain linux terminal.  */
@@ -364,7 +365,7 @@ ui_file_style::parse (const char *buf, size_t *n_read)
 {
   regmatch_t subexps[NUM_SUBEXPRESSIONS];
 
-  int match = regexec (&ansi_regex, buf, ARRAY_SIZE (subexps), subexps, 0);
+  int match = ansi_regex.exec (buf, ARRAY_SIZE (subexps), subexps, 0);
   if (match == REG_NOMATCH)
     {
       *n_read = 0;
@@ -531,7 +532,7 @@ skip_ansi_escape (const char *buf, int *n_read)
 {
   regmatch_t subexps[NUM_SUBEXPRESSIONS];
 
-  int match = regexec (&ansi_regex, buf, ARRAY_SIZE (subexps), subexps, 0);
+  int match = ansi_regex.exec (buf, ARRAY_SIZE (subexps), subexps, 0);
   if (match == REG_NOMATCH || buf[subexps[FINAL_SUBEXP].rm_so] != 'm')
     return false;
 
@@ -539,16 +540,6 @@ skip_ansi_escape (const char *buf, int *n_read)
   return true;
 }
 
-void _initialize_ui_style ();
-void
-_initialize_ui_style ()
-{
-  int code = regcomp (&ansi_regex, ansi_regex_text, REG_EXTENDED);
-  /* If the regular expression was incorrect, it was a programming
-     error.  */
-  gdb_assert (code == 0);
-}
-
 /* See ui-style.h.  */
 
 const std::vector<color_space> &