From: Bruno Haible Date: Sun, 12 Mar 2023 23:51:07 +0000 (+0100) Subject: Fix lisp-format, scheme-format: Fix a memory corruption bug. X-Git-Tag: v0.22~111 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3904fddd401dc6b22bffedcc8668f144fe467494;p=thirdparty%2Fgettext.git Fix lisp-format, scheme-format: Fix a memory corruption bug. * gettext-tools/src/format-lisp.c (make_repeated_list): Access the correct array. * gettext-tools/src/format-scheme.c (make_repeated_list): Likewise. * gettext-tools/tests/xgettext-lisp-3: New file. * gettext-tools/tests/xgettext-scheme-5: New file. * gettext-tools/tests/Makefile.am (TESTS): Add them. --- diff --git a/gettext-tools/src/format-lisp.c b/gettext-tools/src/format-lisp.c index 94194dbef..f69c880e4 100644 --- a/gettext-tools/src/format-lisp.c +++ b/gettext-tools/src/format-lisp.c @@ -1,6 +1,5 @@ /* Lisp format strings. - Copyright (C) 2001-2004, 2006-2007, 2009, 2014, 2019 Free Software - Foundation, Inc. + Copyright (C) 2001-2004, 2006-2007, 2009, 2014, 2019, 2023 Free Software Foundation, Inc. Written by Bruno Haible , 2001. This program is free software: you can redistribute it and/or modify @@ -2125,7 +2124,7 @@ make_repeated_list (struct format_arg_list *sublist, unsigned int period) for (i = 0; i < sublist->initial.count; i++) tmp.element[i] = sublist->initial.element[i]; for (j = 0; j < sublist->repeated.count; i++, j++) - tmp.element[i] = sublist->initial.element[j]; + tmp.element[i] = sublist->repeated.element[j]; tmp.length = sublist->initial.length + sublist->repeated.length; srcseg = &tmp; diff --git a/gettext-tools/src/format-scheme.c b/gettext-tools/src/format-scheme.c index 9958a475e..184ce5cac 100644 --- a/gettext-tools/src/format-scheme.c +++ b/gettext-tools/src/format-scheme.c @@ -1,5 +1,5 @@ /* Scheme format strings. - Copyright (C) 2001-2007, 2009, 2014, 2019 Free Software Foundation, Inc. + Copyright (C) 2001-2007, 2009, 2014, 2019, 2023 Free Software Foundation, Inc. Written by Bruno Haible , 2001. This program is free software: you can redistribute it and/or modify @@ -2147,7 +2147,7 @@ make_repeated_list (struct format_arg_list *sublist, unsigned int period) for (i = 0; i < sublist->initial.count; i++) tmp.element[i] = sublist->initial.element[i]; for (j = 0; j < sublist->repeated.count; i++, j++) - tmp.element[i] = sublist->initial.element[j]; + tmp.element[i] = sublist->repeated.element[j]; tmp.length = sublist->initial.length + sublist->repeated.length; srcseg = &tmp; diff --git a/gettext-tools/tests/Makefile.am b/gettext-tools/tests/Makefile.am index fcb60d81d..034296659 100644 --- a/gettext-tools/tests/Makefile.am +++ b/gettext-tools/tests/Makefile.am @@ -121,7 +121,7 @@ TESTS = gettext-1 gettext-2 \ xgettext-javascript-stackovfl-7 xgettext-javascript-stackovfl-8 \ xgettext-librep-1 xgettext-librep-2 xgettext-librep-3 \ xgettext-librep-stackovfl-1 xgettext-librep-stackovfl-2 \ - xgettext-lisp-1 xgettext-lisp-2 \ + xgettext-lisp-1 xgettext-lisp-2 xgettext-lisp-3 \ xgettext-lisp-stackovfl-1 xgettext-lisp-stackovfl-2 \ xgettext-lua-1 xgettext-lua-2 xgettext-lua-3 \ xgettext-lua-stackovfl-1 xgettext-lua-stackovfl-2 \ @@ -145,7 +145,7 @@ TESTS = gettext-1 gettext-2 \ xgettext-python-stackovfl-3 xgettext-python-stackovfl-4 \ xgettext-ruby-1 \ xgettext-scheme-1 xgettext-scheme-2 xgettext-scheme-3 \ - xgettext-scheme-4 \ + xgettext-scheme-4 xgettext-scheme-5 \ xgettext-scheme-stackovfl-1 xgettext-scheme-stackovfl-2 \ xgettext-sh-1 xgettext-sh-2 xgettext-sh-3 xgettext-sh-4 xgettext-sh-5 \ xgettext-sh-6 xgettext-sh-7 \ diff --git a/gettext-tools/tests/xgettext-lisp-3 b/gettext-tools/tests/xgettext-lisp-3 new file mode 100755 index 000000000..901c245a7 --- /dev/null +++ b/gettext-tools/tests/xgettext-lisp-3 @@ -0,0 +1,24 @@ +#! /bin/sh +. "${srcdir=.}/init.sh"; path_prepend_ . ../src + +# Test Lisp support: lisp-format string with a loop. + +cat < xg-ls-3.lisp +(gettext "~{~*~}") +EOF + +: ${XGETTEXT=xgettext} +${XGETTEXT} --omit-header --no-location -d xg-ls-3.tmp xg-ls-3.lisp || Exit 1 +LC_ALL=C tr -d '\r' < xg-ls-3.tmp.po > xg-ls-3.po || Exit 1 + +cat < xg-ls-3.ok +#, lisp-format +msgid "~{~*~}" +msgstr "" +EOF + +: ${DIFF=diff} +${DIFF} xg-ls-3.ok xg-ls-3.po +result=$? + +exit $result diff --git a/gettext-tools/tests/xgettext-scheme-5 b/gettext-tools/tests/xgettext-scheme-5 new file mode 100755 index 000000000..9d9284585 --- /dev/null +++ b/gettext-tools/tests/xgettext-scheme-5 @@ -0,0 +1,24 @@ +#! /bin/sh +. "${srcdir=.}/init.sh"; path_prepend_ . ../src + +# Test Scheme support: scheme-format string with a loop. + +cat < xg-sc-5.scm +(_ "~{~*~}") +EOF + +: ${XGETTEXT=xgettext} +${XGETTEXT} -k_ --omit-header --no-location -d xg-sc-5.tmp xg-sc-5.scm || Exit 1 +LC_ALL=C tr -d '\r' < xg-sc-5.tmp.po > xg-sc-5.po || Exit 1 + +cat < xg-sc-5.ok +#, scheme-format +msgid "~{~*~}" +msgstr "" +EOF + +: ${DIFF=diff} +${DIFF} xg-sc-5.ok xg-sc-5.po +result=$? + +exit $result