From: Daiki Ueno Date: Fri, 12 Dec 2014 08:18:51 +0000 (+0900) Subject: lisp, scheme: Avoid invalid memory access X-Git-Tag: v0.19.4~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9c65deea0a1f1059db05a0576a683702f3360112;p=thirdparty%2Fgettext.git lisp, scheme: Avoid invalid memory access * 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. --- diff --git a/gettext-tools/src/ChangeLog b/gettext-tools/src/ChangeLog index 02cbf9183..31aa6c4bc 100644 --- a/gettext-tools/src/ChangeLog +++ b/gettext-tools/src/ChangeLog @@ -1,3 +1,10 @@ +2014-12-12 Daiki Ueno + + * 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 * msgl-check.c (check_header_entry): Don't declare unused variable diff --git a/gettext-tools/src/format-lisp.c b/gettext-tools/src/format-lisp.c index c29aef33e..7d423a51a 100644 --- a/gettext-tools/src/format-lisp.c +++ b/gettext-tools/src/format-lisp.c @@ -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); diff --git a/gettext-tools/src/format-scheme.c b/gettext-tools/src/format-scheme.c index fd315fac9..02c618213 100644 --- a/gettext-tools/src/format-scheme.c +++ b/gettext-tools/src/format-scheme.c @@ -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);