1b5975d6bSopenharmony_ciFrom c05d09044fb71bdea599c81bf0ae896a5503e76a Mon Sep 17 00:00:00 2001
2b5975d6bSopenharmony_ciFrom: Marco Trevisan <mail@3v1n0.net>
3b5975d6bSopenharmony_ciDate: Fri, 15 Jul 2022 01:27:33 +0200
4b5975d6bSopenharmony_ciSubject: [PATCH] gregex: Ensure we translate the errcode without asserting on
5b5975d6bSopenharmony_ci G_REGEX_ERROR_COMPILE
6b5975d6bSopenharmony_ci
7b5975d6bSopenharmony_ciSince commit 8d5a44dc in order to ensure that we were setting the errcode in
8b5975d6bSopenharmony_citranslate_compile_error(), we did an assert checking whether it was a
9b5975d6bSopenharmony_civalid value, but we assumed that 0 was not a valid error, while it is as
10b5975d6bSopenharmony_ciit's the generic G_REGEX_ERROR_COMPILE.
11b5975d6bSopenharmony_ci
12b5975d6bSopenharmony_ciSo, set errcode and errmsg to invalid values before translating and
13b5975d6bSopenharmony_ciensure we've change them.
14b5975d6bSopenharmony_ci
15b5975d6bSopenharmony_ciFixes: #2694
16b5975d6bSopenharmony_ci
17b5975d6bSopenharmony_ciConflict:NA
18b5975d6bSopenharmony_ciReference:https://gitlab.gnome.org/GNOME/glib/-/commit/c05d09044fb71bdea599c81bf0ae896a5503e76a
19b5975d6bSopenharmony_ci
20b5975d6bSopenharmony_ci---
21b5975d6bSopenharmony_ci glib/gregex.c      |  8 ++++++--
22b5975d6bSopenharmony_ci glib/tests/regex.c | 13 +++++++++++++
23b5975d6bSopenharmony_ci 2 files changed, 19 insertions(+), 2 deletions(-)
24b5975d6bSopenharmony_ci
25b5975d6bSopenharmony_cidiff --git a/glib/gregex.c b/glib/gregex.c
26b5975d6bSopenharmony_ciindex 5fc7b16bc8..2a54929bf4 100644
27b5975d6bSopenharmony_ci--- a/glib/gregex.c
28b5975d6bSopenharmony_ci+++ b/glib/gregex.c
29b5975d6bSopenharmony_ci@@ -476,8 +476,12 @@ translate_compile_error (gint *errcode, const gchar **errmsg)
30b5975d6bSopenharmony_ci    * Note that there can be more PCRE errors with the same GRegexError
31b5975d6bSopenharmony_ci    * and that some PCRE errors are useless for us.
32b5975d6bSopenharmony_ci    */
33b5975d6bSopenharmony_ci+  gint original_errcode = *errcode;
34b5975d6bSopenharmony_ci 
35b5975d6bSopenharmony_ci-  switch (*errcode)
36b5975d6bSopenharmony_ci+  *errcode = -1;
37b5975d6bSopenharmony_ci+  *errmsg = NULL;
38b5975d6bSopenharmony_ci+
39b5975d6bSopenharmony_ci+  switch (original_errcode)
40b5975d6bSopenharmony_ci     {
41b5975d6bSopenharmony_ci     case PCRE2_ERROR_END_BACKSLASH:
42b5975d6bSopenharmony_ci       *errcode = G_REGEX_ERROR_STRAY_BACKSLASH;
43b5975d6bSopenharmony_ci@@ -725,7 +729,7 @@ translate_compile_error (gint *errcode, const gchar **errmsg)
44b5975d6bSopenharmony_ci       break;
45b5975d6bSopenharmony_ci     }
46b5975d6bSopenharmony_ci 
47b5975d6bSopenharmony_ci-  g_assert (*errcode != 0);
48b5975d6bSopenharmony_ci+  g_assert (*errcode != -1);
49b5975d6bSopenharmony_ci   g_assert (*errmsg != NULL);
50b5975d6bSopenharmony_ci }
51b5975d6bSopenharmony_ci 
52b5975d6bSopenharmony_cidiff --git a/glib/tests/regex.c b/glib/tests/regex.c
53b5975d6bSopenharmony_ciindex 3355f64e54..9a1977b248 100644
54b5975d6bSopenharmony_ci--- a/glib/tests/regex.c
55b5975d6bSopenharmony_ci+++ b/glib/tests/regex.c
56b5975d6bSopenharmony_ci@@ -2187,6 +2187,18 @@ pcre2_ge (guint64 major, guint64 minor)
57b5975d6bSopenharmony_ci     return (pcre2_major > major) || (pcre2_major == major && pcre2_minor >= minor);
58b5975d6bSopenharmony_ci }
59b5975d6bSopenharmony_ci 
60b5975d6bSopenharmony_ci+static void
61b5975d6bSopenharmony_ci+test_compile_errors (void)
62b5975d6bSopenharmony_ci+{
63b5975d6bSopenharmony_ci+  GRegex *regex;
64b5975d6bSopenharmony_ci+  GError *error = NULL;
65b5975d6bSopenharmony_ci+
66b5975d6bSopenharmony_ci+  regex = g_regex_new ("\\o{999}", G_REGEX_DEFAULT, G_REGEX_MATCH_DEFAULT, &error);
67b5975d6bSopenharmony_ci+  g_assert_null (regex);
68b5975d6bSopenharmony_ci+  g_assert_error (error, G_REGEX_ERROR, G_REGEX_ERROR_COMPILE);
69b5975d6bSopenharmony_ci+  g_clear_error (&error);
70b5975d6bSopenharmony_ci+}
71b5975d6bSopenharmony_ci+
72b5975d6bSopenharmony_ci int
73b5975d6bSopenharmony_ci main (int argc, char *argv[])
74b5975d6bSopenharmony_ci {
75b5975d6bSopenharmony_ci@@ -2204,6 +2216,7 @@ main (int argc, char *argv[])
76b5975d6bSopenharmony_ci   g_test_add_func ("/regex/multiline", test_multiline);
77b5975d6bSopenharmony_ci   g_test_add_func ("/regex/explicit-crlf", test_explicit_crlf);
78b5975d6bSopenharmony_ci   g_test_add_func ("/regex/max-lookbehind", test_max_lookbehind);
79b5975d6bSopenharmony_ci+  g_test_add_func ("/regex/compile-errors", test_compile_errors);
80b5975d6bSopenharmony_ci 
81b5975d6bSopenharmony_ci   /* TEST_NEW(pattern, compile_opts, match_opts) */
82b5975d6bSopenharmony_ci G_GNUC_BEGIN_IGNORE_DEPRECATIONS
83b5975d6bSopenharmony_ci-- 
84b5975d6bSopenharmony_ciGitLab
85b5975d6bSopenharmony_ci
86