mirror of
https://https.git.savannah.gnu.org/git/gettext.git
synced 2026-01-27 01:44:30 +00:00
xgettext: In language Tcl, avoid a crash at surrogate character escapes.
* gettext-tools/src/x-tcl.c (accumulate_word): Warn when seeing a surrogate character, instead of aborting. * gettext-tools/tests/xgettext-tcl-5: New file. * gettext-tools/tests/Makefile.am (TESTS): Add it.
This commit is contained in:
parent
f1b2a62f9b
commit
fa2fbdbcbf
@ -707,13 +707,23 @@ accumulate_word (struct word *wp, enum terminator looking_for,
|
||||
uc = do_getc_escaped ();
|
||||
assert (uc < 0x10000);
|
||||
count = u8_uctomb (utf8buf, uc, 6);
|
||||
assert (count > 0);
|
||||
if (wp->type == t_string)
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
grow_token (wp->token);
|
||||
wp->token->chars[wp->token->charcount++] = utf8buf[i];
|
||||
}
|
||||
if (count < 0)
|
||||
{
|
||||
error_with_progname = false;
|
||||
error (0, 0, _("%s:%d: warning: invalid Unicode character"),
|
||||
logical_file_name, line_number);
|
||||
error_with_progname = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
assert (count > 0);
|
||||
if (wp->type == t_string)
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
grow_token (wp->token);
|
||||
wp->token->chars[wp->token->charcount++] = utf8buf[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@ -156,6 +156,7 @@ TESTS = gettext-1 gettext-2 \
|
||||
xgettext-smalltalk-1 xgettext-smalltalk-2 \
|
||||
xgettext-stringtable-1 \
|
||||
xgettext-tcl-1 xgettext-tcl-2 xgettext-tcl-3 xgettext-tcl-4 \
|
||||
xgettext-tcl-5 \
|
||||
xgettext-tcl-stackovfl-1 xgettext-tcl-stackovfl-2 \
|
||||
xgettext-tcl-stackovfl-3 xgettext-tcl-stackovfl-4 \
|
||||
xgettext-vala-1 xgettext-vala-2 xgettext-vala-3 xgettext-vala-4 \
|
||||
|
||||
26
gettext-tools/tests/xgettext-tcl-5
Executable file
26
gettext-tools/tests/xgettext-tcl-5
Executable file
@ -0,0 +1,26 @@
|
||||
#!/bin/sh
|
||||
. "${srcdir=.}/init.sh"; path_prepend_ . ../src
|
||||
|
||||
# Test of Tcl support: escape sequences with unpaired surrogates.
|
||||
|
||||
cat <<\EOF > xg-t-5a.tcl
|
||||
puts [_ "\uD83D"]
|
||||
EOF
|
||||
|
||||
cat <<\EOF > xg-t-5b.tcl
|
||||
puts [_ "\udc1c"]
|
||||
EOF
|
||||
|
||||
: ${XGETTEXT=xgettext}
|
||||
LANGUAGE= LC_ALL=C ${XGETTEXT} --no-location -k_ -d xg-t-5.tmp xg-t-5a.tcl 2>xg-t-5.err
|
||||
result=$?
|
||||
cat xg-t-5.err
|
||||
test $result = 0 || Exit 1
|
||||
|
||||
: ${XGETTEXT=xgettext}
|
||||
LANGUAGE= LC_ALL=C ${XGETTEXT} --no-location -k_ -d xg-t-5.tmp xg-t-5b.tcl 2>xg-t-5.err
|
||||
result=$?
|
||||
cat xg-t-5.err
|
||||
test $result = 0 || Exit 1
|
||||
|
||||
exit 0
|
||||
Loading…
x
Reference in New Issue
Block a user