/[packages]/updates/8/expat/current/SOURCES/CVE-2022-25235-2.patch
ViewVC logotype

Annotation of /updates/8/expat/current/SOURCES/CVE-2022-25235-2.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1790357 - (hide annotations) (download)
Fri Mar 11 09:19:06 2022 UTC (2 years, 1 month ago) by ns80
File size: 6176 byte(s)
- add patches from Ubuntu to fix regressions introduced by security fixes (mga#30145)

1 ns80 1790357 From 97cfdc3fa7dca759880d81e371901f4620279106 Mon Sep 17 00:00:00 2001
2     From: Sebastian Pipping <sebastian@pipping.org>
3     Date: Tue, 8 Feb 2022 04:06:21 +0100
4     Subject: [PATCH] tests: Cover missing validation of encoding (CVE-2022-25235)
5    
6     ---
7     expat/tests/runtests.c | 109 +++++++++++++++++++++++++++++++++++++++++
8     1 file changed, 109 insertions(+)
9    
10     --- a/tests/runtests.c
11     +++ b/tests/runtests.c
12     @@ -5997,6 +5997,105 @@ START_TEST(test_utf8_in_cdata_section_2)
13     }
14     END_TEST
15    
16     +START_TEST(test_utf8_in_start_tags) {
17     + struct test_case {
18     + bool goodName;
19     + bool goodNameStart;
20     + const char *tagName;
21     + };
22     +
23     + // The idea with the tests below is this:
24     + // We want to cover 1-, 2- and 3-byte sequences, 4-byte sequences
25     + // go to isNever and are hence not a concern.
26     + //
27     + // We start with a character that is a valid name character
28     + // (or even name-start character, see XML 1.0r4 spec) and then we flip
29     + // single bits at places where (1) the result leaves the UTF-8 encoding space
30     + // and (2) we stay in the same n-byte sequence family.
31     + //
32     + // The flipped bits are highlighted in angle brackets in comments,
33     + // e.g. "[<1>011 1001]" means we had [0011 1001] but we now flipped
34     + // the most significant bit to 1 to leave UTF-8 encoding space.
35     + struct test_case cases[] = {
36     + // 1-byte UTF-8: [0xxx xxxx]
37     + {true, true, "\x3A"}, // [0011 1010] = ASCII colon ':'
38     + {false, false, "\xBA"}, // [<1>011 1010]
39     + {true, false, "\x39"}, // [0011 1001] = ASCII nine '9'
40     + {false, false, "\xB9"}, // [<1>011 1001]
41     +
42     + // 2-byte UTF-8: [110x xxxx] [10xx xxxx]
43     + {true, true, "\xDB\xA5"}, // [1101 1011] [1010 0101] =
44     + // Arabic small waw U+06E5
45     + {false, false, "\x9B\xA5"}, // [1<0>01 1011] [1010 0101]
46     + {false, false, "\xDB\x25"}, // [1101 1011] [<0>010 0101]
47     + {false, false, "\xDB\xE5"}, // [1101 1011] [1<1>10 0101]
48     + {true, false, "\xCC\x81"}, // [1100 1100] [1000 0001] =
49     + // combining char U+0301
50     + {false, false, "\x8C\x81"}, // [1<0>00 1100] [1000 0001]
51     + {false, false, "\xCC\x01"}, // [1100 1100] [<0>000 0001]
52     + {false, false, "\xCC\xC1"}, // [1100 1100] [1<1>00 0001]
53     +
54     + // 3-byte UTF-8: [1110 xxxx] [10xx xxxx] [10xxxxxx]
55     + {true, true, "\xE0\xA4\x85"}, // [1110 0000] [1010 0100] [1000 0101] =
56     + // Devanagari Letter A U+0905
57     + {false, false, "\xA0\xA4\x85"}, // [1<0>10 0000] [1010 0100] [1000 0101]
58     + {false, false, "\xE0\x24\x85"}, // [1110 0000] [<0>010 0100] [1000 0101]
59     + {false, false, "\xE0\xE4\x85"}, // [1110 0000] [1<1>10 0100] [1000 0101]
60     + {false, false, "\xE0\xA4\x05"}, // [1110 0000] [1010 0100] [<0>000 0101]
61     + {false, false, "\xE0\xA4\xC5"}, // [1110 0000] [1010 0100] [1<1>00 0101]
62     + {true, false, "\xE0\xA4\x81"}, // [1110 0000] [1010 0100] [1000 0001] =
63     + // combining char U+0901
64     + {false, false, "\xA0\xA4\x81"}, // [1<0>10 0000] [1010 0100] [1000 0001]
65     + {false, false, "\xE0\x24\x81"}, // [1110 0000] [<0>010 0100] [1000 0001]
66     + {false, false, "\xE0\xE4\x81"}, // [1110 0000] [1<1>10 0100] [1000 0001]
67     + {false, false, "\xE0\xA4\x01"}, // [1110 0000] [1010 0100] [<0>000 0001]
68     + {false, false, "\xE0\xA4\xC1"}, // [1110 0000] [1010 0100] [1<1>00 0001]
69     + };
70     + const bool atNameStart[] = {true, false};
71     +
72     + size_t i = 0;
73     + char doc[1024];
74     + size_t failCount = 0;
75     +
76     + for (; i < sizeof(cases) / sizeof(cases[0]); i++) {
77     + size_t j = 0;
78     + for (; j < sizeof(atNameStart) / sizeof(atNameStart[0]); j++) {
79     + const bool expectedSuccess
80     + = atNameStart[j] ? cases[i].goodNameStart : cases[i].goodName;
81     + sprintf(doc, "<%s%s><!--", atNameStart[j] ? "" : "a", cases[i].tagName);
82     + XML_Parser parser = XML_ParserCreate(NULL);
83     +
84     + const enum XML_Status status
85     + = XML_Parse(parser, doc, (int)strlen(doc), /*isFinal=*/XML_FALSE);
86     +
87     + bool success = true;
88     + if ((status == XML_STATUS_OK) != expectedSuccess) {
89     + success = false;
90     + }
91     + if ((status == XML_STATUS_ERROR)
92     + && (XML_GetErrorCode(parser) != XML_ERROR_INVALID_TOKEN)) {
93     + success = false;
94     + }
95     +
96     + if (! success) {
97     + fprintf(
98     + stderr,
99     + "FAIL case %2u (%sat name start, %u-byte sequence, error code %d)\n",
100     + (unsigned)i + 1u, atNameStart[j] ? " " : "not ",
101     + (unsigned)strlen(cases[i].tagName), XML_GetErrorCode(parser));
102     + failCount++;
103     + }
104     +
105     + XML_ParserFree(parser);
106     + }
107     + }
108     +
109     + if (failCount > 0) {
110     + fail("UTF-8 regression detected");
111     + }
112     +}
113     +END_TEST
114     +
115     /* Test trailing spaces in elements are accepted */
116     static void XMLCALL
117     record_element_end_handler(void *userData, const XML_Char *name) {
118     @@ -6174,6 +6273,14 @@ START_TEST(test_bad_doctype) {
119     }
120     END_TEST
121    
122     +START_TEST(test_bad_doctype_utf8) {
123     + const char *text = "<!DOCTYPE \xDB\x25"
124     + "doc><doc/>"; // [1101 1011] [<0>010 0101]
125     + expect_failure(text, XML_ERROR_INVALID_TOKEN,
126     + "Invalid UTF-8 in DOCTYPE not faulted");
127     +}
128     +END_TEST
129     +
130     START_TEST(test_bad_doctype_utf16) {
131     const char text[] =
132     /* <!DOCTYPE doc [ \x06f2 ]><doc/>
133     @@ -11426,6 +11533,7 @@ make_suite(void) {
134     tcase_add_test(tc_basic, test_ext_entity_utf8_non_bom);
135     tcase_add_test(tc_basic, test_utf8_in_cdata_section);
136     tcase_add_test(tc_basic, test_utf8_in_cdata_section_2);
137     + tcase_add_test(tc_basic, test_utf8_in_start_tags);
138     tcase_add_test(tc_basic, test_trailing_spaces_in_elements);
139     tcase_add_test(tc_basic, test_utf16_attribute);
140     tcase_add_test(tc_basic, test_utf16_second_attr);
141     @@ -11434,6 +11542,7 @@ make_suite(void) {
142     tcase_add_test(tc_basic, test_bad_attr_desc_keyword);
143     tcase_add_test(tc_basic, test_bad_attr_desc_keyword_utf16);
144     tcase_add_test(tc_basic, test_bad_doctype);
145     + tcase_add_test(tc_basic, test_bad_doctype_utf8);
146     tcase_add_test(tc_basic, test_bad_doctype_utf16);
147     tcase_add_test(tc_basic, test_bad_doctype_plus);
148     tcase_add_test(tc_basic, test_bad_doctype_star);

  ViewVC Help
Powered by ViewVC 1.1.30