diff --git a/core/results.py b/core/results.py index 500141b2..9c74f1de 100644 --- a/core/results.py +++ b/core/results.py @@ -284,9 +284,12 @@ class Results(Markable): except AttributeError: words = () file_elem = etree.SubElement(group_elem, 'file') - file_elem.set('path', unicode(d.path)) + try: + file_elem.set('path', unicode(d.path)) + file_elem.set('words', ','.join(words)) + except ValueError: # If there's an invalid character, just skip the file + file_elem.set('path', '') file_elem.set('is_ref', ('y' if d.is_ref else 'n')) - file_elem.set('words', ','.join(words)) file_elem.set('marked', ('y' if self.is_marked(d) else 'n')) for match in g.matches: match_elem = etree.SubElement(group_elem, 'match') diff --git a/core/tests/results_test.py b/core/tests/results_test.py index cdc682e7..e03bd339 100644 --- a/core/tests/results_test.py +++ b/core/tests/results_test.py @@ -574,6 +574,12 @@ class TCResultsXML(TestCase): # apply_filter() searches on the whole path, not just on the filename. self.results.apply_filter(u'basepath') eq_(len(self.results.groups), 2) + + def test_save_xml_with_invalid_characters(self): + # Don't crash when saving files that have invalid xml characters in their path + self.objects[0].name = u'foo\x19' + self.results.save_to_xml(StringIO.StringIO()) # don't crash + class TCResultsFilter(TestCase): def setUp(self):