[CVE-2009-5155] Diagnose ERE '()|\1' 43/254743/2 accepted/tizen_6.5_base accepted/tizen_6.5_base_tool accepted/tizen_7.0_base accepted/tizen_7.0_base_hotfix accepted/tizen_7.0_base_tool accepted/tizen_7.0_base_tool_hotfix tizen_6.5_base tizen_7.0_base tizen_7.0_base_hotfix accepted/tizen/6.5/base/20230714.002808 accepted/tizen/6.5/base/tool/20211027.105707 accepted/tizen/6.5/base/tool/20211027.121842 accepted/tizen/7.0/base/20230714.003216 accepted/tizen/7.0/base/hotfix/20230714.004025 accepted/tizen/7.0/base/tool/20221028.120752 accepted/tizen/7.0/base/tool/hotfix/20221115.084825 accepted/tizen/base/tool/20210321.225331 submit/tizen_6.5_base/20211026.180902 submit/tizen_6.5_base/20211027.183102 submit/tizen_6.5_base/20211027.201201 submit/tizen_7.0_base/20221028.201301 submit/tizen_7.0_base_hotfix/20221115.161701 submit/tizen_base/20210317.073914 tizen_6.5.m2_release tizen_7.0_m2_release
authorJinWang An <jinwang.an@samsung.com>
Tue, 9 Mar 2021 05:53:57 +0000 (14:53 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Wed, 17 Mar 2021 07:38:05 +0000 (16:38 +0900)
Problem reported by Hanno Böck in: http://bugs.gnu.org/21513
* lib/regcomp.c (parse_reg_exp): While parsing alternatives, keep
track of the set of previously-completed subexpressions available
before the first alternative, and restore this set just before
parsing each subsequent alternative.  This lets us diagnose the
invalid back-reference in the ERE '()|\1'.

Change-Id: I18a2ec367b04a69d8429e92a1b4784b6d7692832
Signed-off-by: JinWang An <jinwang.an@samsung.com>
lib/regcomp.c

index fe4d243d54f7da219569584dc5f03476ba59954c..022abb520dfe96311f12be3fd807988e29cd77a0 100644 (file)
@@ -2116,6 +2116,7 @@ parse_reg_exp (re_string_t *regexp, regex_t *preg, re_token_t *token,
 {
   re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
   bin_tree_t *tree, *branch = NULL;
+  bitset_word_t initial_bkref_map = dfa->completed_bkref_map;
   tree = parse_branch (regexp, preg, token, syntax, nest, err);
   if (BE (*err != REG_NOERROR && tree == NULL, 0))
     return NULL;
@@ -2126,9 +2127,16 @@ parse_reg_exp (re_string_t *regexp, regex_t *preg, re_token_t *token,
       if (token->type != OP_ALT && token->type != END_OF_RE
          && (nest == 0 || token->type != OP_CLOSE_SUBEXP))
        {
+         bitset_word_t accumulated_bkref_map = dfa->completed_bkref_map;
+         dfa->completed_bkref_map = initial_bkref_map;
          branch = parse_branch (regexp, preg, token, syntax, nest, err);
          if (BE (*err != REG_NOERROR && branch == NULL, 0))
-           return NULL;
+           {
+             if (tree != NULL)
+                    postorder (tree, free_tree, NULL);
+             return NULL;
+           }
+         dfa->completed_bkref_map |= accumulated_bkref_map;
        }
       else
        branch = NULL;