]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
lisp, scheme: Avoid invalid memory access
authorDaiki Ueno <ueno@gnu.org>
Fri, 12 Dec 2014 08:18:51 +0000 (17:18 +0900)
committerDaiki Ueno <ueno@gnu.org>
Fri, 12 Dec 2014 08:18:51 +0000 (17:18 +0900)
* format-lisp.c (make_intersected_list): Don't dereference
potentially released memory.  'append_repeated_to_initial' may
release the LIST->element.  Spotted by clang-analyzer.
* format-scheme.c (make_intersected_list): Likewise.

gettext-tools/src/ChangeLog
gettext-tools/src/format-lisp.c
gettext-tools/src/format-scheme.c

index 02cbf9183fa0a2f8271d38a84d2bc60338358ef4..31aa6c4bcf92f9541d201c45d900782157cda0bf 100644 (file)
@@ -1,3 +1,10 @@
+2014-12-12  Daiki Ueno  <ueno@gnu.org>
+
+       * format-lisp.c (make_intersected_list): Don't dereference
+       potentially released memory.  'append_repeated_to_initial' may
+       release the LIST->element.  Spotted by clang-analyzer.
+       * format-scheme.c (make_intersected_list): Likewise.
+
 2014-12-10  Daiki Ueno  <ueno@gnu.org>
 
        * msgl-check.c (check_header_entry): Don't declare unused variable
index c29aef33ef7af6cd17e2d096b2c7053550257514..7d423a51a5ee4a657a0b2a046a8bf698dc15c873 100644 (file)
@@ -1272,10 +1272,12 @@ make_intersected_list (struct format_arg_list *list1,
         /* Intersect the argument types.  */
         if (!make_intersected_element (re, e1, e2))
           {
+            bool re_is_required = re->presence == FCT_REQUIRED;
+
             append_repeated_to_initial (result);
 
             /* If re->presence == FCT_OPTIONAL, the result list ends here.  */
-            if (re->presence == FCT_REQUIRED)
+            if (re_is_required)
               /* Contradiction.  Backtrack.  */
               result = backtrack_in_initial (result);
 
index fd315fac9076eca881e178216d2dae05d1632860..02c618213a2db10346fe763b2d40550444d3eab9 100644 (file)
@@ -1285,10 +1285,12 @@ make_intersected_list (struct format_arg_list *list1,
         /* Intersect the argument types.  */
         if (!make_intersected_element (re, e1, e2))
           {
+            bool re_is_required = re->presence == FCT_REQUIRED;
+
             append_repeated_to_initial (result);
 
             /* If re->presence == FCT_OPTIONAL, the result list ends here.  */
-            if (re->presence == FCT_REQUIRED)
+            if (re_is_required)
               /* Contradiction.  Backtrack.  */
               result = backtrack_in_initial (result);