# --- T2-COPYRIGHT-NOTE-BEGIN --- # T2 SDE: package/*/itstool/hotfix-crash-912099.patch # Copyright (C) 2023 The T2 SDE Project # # This Copyright note is generated by scripts/Create-CopyPatch, # more information can be found in the files COPYING and README. # # This patch file is dual-licensed. It is available under the license the # patched project is licensed under, as long as it is an OpenSource license # as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms # of the GNU General Public License version 2 as used by the T2 SDE. # --- T2-COPYRIGHT-NOTE-END --- From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Tanguy Ortolo Date: Fri, 7 Dec 2018 00:00:00 +0000 Subject: [PATCH] Fix the crash from #912099 ITS Tool 2.0.4 crashes when building some documentation, as reported in #912099. This comes from translations with invalid XML markup, which ITS Tool fails to merge (which is not abnormal), and to report these issues, needlessly encodes the original msgstr from unicode to bytes, causing it to be recoded using the default ascii codec, which fails when the msgstr contains anything out of ascii. This patch removes the useless decoding, avoiding the failing subsequent recoding. It also explicitly encodes the output strings to be able to print them in all cases, even when the output encoding cannot be detected. Bug: https://github.com/itstool/itstool/issues/25 Bug-Debian: https://bugs.debian.org/912099 Forwarded: https://github.com/itstool/itstool/issues/25 --- itstool.in | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/itstool.in b/itstool.in index c21ad4bfeb86..f34673581c88 100755 --- a/itstool.in +++ b/itstool.in @@ -44,9 +44,22 @@ if PY3: else: return str(s) ustr_type = str + def pr_str(s): + """Return a string that can be safely print()ed""" + # Since print works on both bytes and unicode, just return the argument + return s else: string_types = basestring, ustr = ustr_type = unicode + def pr_str(s): + """Return a string that can be safely print()ed""" + if isinstance(s, str): + # Since print works on str, just return the argument + return s + else: + # print may not work on unicode if the output encoding cannot be + # detected, so just encode with UTF-8 + return unicode.encode(s, 'utf-8') NS_ITS = 'http://www.w3.org/2005/11/its' NS_ITST = 'http://itstool.org/extensions/' @@ -1077,36 +1090,36 @@ class Document (object): if strict: raise else: - sys.stderr.write('Warning: Could not merge %stranslation for msgid:\n%s\n' % ( + sys.stderr.write(pr_str('Warning: Could not merge %stranslation for msgid:\n%s\n' % ( (lang + ' ') if lang is not None else '', - msgstr.encode('utf-8'))) + msgstr))) self._xml_err = '' return node def scan_node(node): children = [child for child in xml_child_iter(node)] for child in children: if child.type != 'element': continue if child.ns() is not None and child.ns().content == NS_BLANK: ph_node = msg.get_placeholder(child.name).node if self.has_child_elements(ph_node): self.merge_translations(translations, None, ph_node, strict=strict) newnode = ph_node.copyNode(1) newnode.setTreeDoc(self._doc) child.replaceNode(newnode) else: repl = self.get_translated(ph_node, translations, strict=strict, lang=lang) child.replaceNode(repl) scan_node(child) try: scan_node(trnode) except: if strict: raise else: - sys.stderr.write('Warning: Could not merge %stranslation for msgid:\n%s\n' % ( + sys.stderr.write(pr_str('Warning: Could not merge %stranslation for msgid:\n%s\n' % ( (lang + ' ') if lang is not None else '', - msgstr.encode('utf-8'))) + msgstr))) self._xml_err = '' ctxt.doc().freeDoc() return node