Mercurial > pidgin.yaz
annotate libpurple/tests/test_xmlnode.c @ 32498:114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Basically we were treating node->xmlns as the default namespace, but
that isn't the case with prefexed elements. In our serialization,
I believe we were adding an extraneous xmlns='' to a prefixed element,
which changes the (default) namespace for its children. (It's been
a bit too long with this in my tree, so I've forgotten the exact details)
author | Paul Aurich <paul@darkrain42.org> |
---|---|
date | Sun, 04 Sep 2011 18:52:18 +0000 |
parents | c8f91310bfbf |
children | 8d3b5853b017 |
rev | line source |
---|---|
32136
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
1 #include <string.h> |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
2 |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
3 #include "tests.h" |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
4 #include "../xmlnode.h" |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
5 |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
6 /* |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
7 * If we really wanted to test the billion laughs attack we would |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
8 * need to have more than just 4 ha's. But as long as this shorter |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
9 * document fails to parse, the longer one should also fail to parse. |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
10 */ |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
11 START_TEST(test_xmlnode_billion_laughs_attack) |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
12 { |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
13 const char *malicious_xml_doc = "<!DOCTYPE root [ <!ENTITY ha \"Ha !\"><!ENTITY ha2 \"&ha; &ha;\"><!ENTITY ha3 \"&ha2; &ha2;\"> ]><root>&ha3;</root>"; |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
14 |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
15 /* Uncomment this line if you want to see the error message given by |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
16 the parser for the above XML document */ |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
17 /* purple_debug_set_enabled(TRUE); */ |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
18 |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
19 fail_if(xmlnode_from_str(malicious_xml_doc, -1), |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
20 "xmlnode_from_str() returned an XML tree, but we didn't want it to"); |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
21 } |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
22 END_TEST |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
23 |
32498
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
24 #define check_doc_structure(x) { \ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
25 xmlnode *ping, *child1, *child2; \ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
26 fail_if(x == NULL, "Failed to parse document"); \ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
27 ping = xmlnode_get_child(x, "ping"); \ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
28 fail_if(ping == NULL, "Failed to find 'ping' child"); \ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
29 child1 = xmlnode_get_child(ping, "child1"); \ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
30 fail_if(child1 == NULL, "Failed to find 'child1'"); \ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
31 child2 = xmlnode_get_child(child1, "child2"); \ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
32 fail_if(child2 == NULL, "Failed to find 'child2'"); \ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
33 xmlnode_new_child(child2, "a"); \ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
34 \ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
35 assert_string_equal("jabber:client", xmlnode_get_namespace(x)); \ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
36 /* NOTE: xmlnode_get_namespace() returns the namespace of the element, not the |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
37 * current default namespace. See http://www.w3.org/TR/xml-names/#defaulting and |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
38 * http://www.w3.org/TR/xml-names/#dt-defaultNS. |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
39 */ \ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
40 assert_string_equal("urn:xmpp:ping", xmlnode_get_namespace(ping)); \ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
41 assert_string_equal("jabber:client", xmlnode_get_namespace(child1)); \ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
42 assert_string_equal("urn:xmpp:ping", xmlnode_get_namespace(child2)); \ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
43 /* |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
44 * This fails (well, actually crashes [the ns is NULL]) unless |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
45 * xmlnode_new_child() actually sets the element namespace. |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
46 assert_string_equal("jabber:client", xmlnode_get_namespace(xmlnode_get_child(child2, "a"))); |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
47 */ \ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
48 \ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
49 assert_string_equal("jabber:client", xmlnode_get_default_namespace(x)); \ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
50 assert_string_equal("jabber:client", xmlnode_get_default_namespace(ping)); \ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
51 assert_string_equal("jabber:client", xmlnode_get_default_namespace(child1)); \ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
52 assert_string_equal("jabber:client", xmlnode_get_default_namespace(child2)); \ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
53 } |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
54 |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
55 START_TEST(test_xmlnode_prefixes) |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
56 { |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
57 const char *xml_doc = |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
58 "<iq type='get' xmlns='jabber:client' xmlns:ping='urn:xmpp:ping'>" |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
59 "<ping:ping>" |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
60 "<child1>" |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
61 "<ping:child2></ping:child2>" /* xmlns='jabber:child' */ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
62 "</child1>" |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
63 "</ping:ping>" |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
64 "</iq>"; |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
65 char *str; |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
66 xmlnode *xml, *reparsed; |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
67 |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
68 xml = xmlnode_from_str(xml_doc, -1); |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
69 check_doc_structure(xml); |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
70 |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
71 /* Check that xmlnode_from_str(xmlnode_to_str(xml, NULL), -1) is idempotent. */ |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
72 str = xmlnode_to_str(xml, NULL); |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
73 fail_if(str == NULL, "Failed to serialize XMLnode"); |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
74 reparsed = xmlnode_from_str(str, -1); |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
75 fail_if(reparsed == NULL, "Failed to reparse xml document"); |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
76 check_doc_structure(reparsed); |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
77 |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
78 g_free(str); |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
79 xmlnode_free(xml); |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
80 xmlnode_free(reparsed); |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
81 } |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
82 END_TEST |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
83 |
32136
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
84 Suite * |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
85 xmlnode_suite(void) |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
86 { |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
87 Suite *s = suite_create("Utility Functions"); |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
88 |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
89 TCase *tc = tcase_create("xmlnode"); |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
90 tcase_add_test(tc, test_xmlnode_billion_laughs_attack); |
32498
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
91 tcase_add_test(tc, test_xmlnode_prefixes); |
114a98da1a5f
xmlnode: Fix some brokeness in xmlnode serialization with prefixed elements.
Paul Aurich <paul@darkrain42.org>
parents:
32136
diff
changeset
|
92 |
32136
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
93 suite_add_tcase(s, tc); |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
94 |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
95 return s; |
c8f91310bfbf
Add a silly little check to make sure our xml parser isn't vulnerable to the
Mark Doliner <mark@kingant.net>
parents:
diff
changeset
|
96 } |