1*7c568831SAndroid Build Coastguard Worker /*
2*7c568831SAndroid Build Coastguard Worker * api.c: a libFuzzer target to test node-related API functions.
3*7c568831SAndroid Build Coastguard Worker *
4*7c568831SAndroid Build Coastguard Worker * See Copyright for the status of this software.
5*7c568831SAndroid Build Coastguard Worker *
6*7c568831SAndroid Build Coastguard Worker * This is a simple virtual machine which runs fuzz data as a program.
7*7c568831SAndroid Build Coastguard Worker * An important design goal is to execute as many API calls as possible
8*7c568831SAndroid Build Coastguard Worker * per input byte.
9*7c568831SAndroid Build Coastguard Worker *
10*7c568831SAndroid Build Coastguard Worker * We use a fixed number of registers for basic types like integers
11*7c568831SAndroid Build Coastguard Worker * or strings as well as libxml2 objects like xmlNode. The opcodes are
12*7c568831SAndroid Build Coastguard Worker * single bytes which typically result in a call to an API function
13*7c568831SAndroid Build Coastguard Worker * using the freshest registers for each argument type and storing the
14*7c568831SAndroid Build Coastguard Worker * result in the stalest register. This can be implemented using a ring
15*7c568831SAndroid Build Coastguard Worker * buffer.
16*7c568831SAndroid Build Coastguard Worker *
17*7c568831SAndroid Build Coastguard Worker * There are a few other opcodes to initialize or duplicate registers,
18*7c568831SAndroid Build Coastguard Worker * so all kinds of API calls can potentially be generated from fuzz
19*7c568831SAndroid Build Coastguard Worker * data.
20*7c568831SAndroid Build Coastguard Worker *
21*7c568831SAndroid Build Coastguard Worker * This architecture is similar to stack machine and benefits from
22*7c568831SAndroid Build Coastguard Worker * great code density. The main difference is that values aren't
23*7c568831SAndroid Build Coastguard Worker * destroyed when popping arguments from the stack and that the bottom
24*7c568831SAndroid Build Coastguard Worker * of the stack is eventually overwritten if the ring buffer overflows.
25*7c568831SAndroid Build Coastguard Worker *
26*7c568831SAndroid Build Coastguard Worker * The main complication is memory management of nodes. Whenever a
27*7c568831SAndroid Build Coastguard Worker * reference between two nodes is removed, whether by an API call or
28*7c568831SAndroid Build Coastguard Worker * the VM clearing a register, we must check whether this leaves
29*7c568831SAndroid Build Coastguard Worker * unreferenced nodes which can then be freed. There are no opcodes
30*7c568831SAndroid Build Coastguard Worker * to free a node explicitly. The FIFO patterns generated by
31*7c568831SAndroid Build Coastguard Worker * overflowing the ring buffer and freeing the registers at the end of
32*7c568831SAndroid Build Coastguard Worker * a program seem to do a good enough job.
33*7c568831SAndroid Build Coastguard Worker */
34*7c568831SAndroid Build Coastguard Worker
35*7c568831SAndroid Build Coastguard Worker #include <stdlib.h>
36*7c568831SAndroid Build Coastguard Worker #include <string.h>
37*7c568831SAndroid Build Coastguard Worker
38*7c568831SAndroid Build Coastguard Worker #define XML_DEPRECATED
39*7c568831SAndroid Build Coastguard Worker
40*7c568831SAndroid Build Coastguard Worker #include <libxml/catalog.h>
41*7c568831SAndroid Build Coastguard Worker #include <libxml/HTMLtree.h>
42*7c568831SAndroid Build Coastguard Worker #include <libxml/parser.h>
43*7c568831SAndroid Build Coastguard Worker #include <libxml/tree.h>
44*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlerror.h>
45*7c568831SAndroid Build Coastguard Worker #include "fuzz.h"
46*7c568831SAndroid Build Coastguard Worker
47*7c568831SAndroid Build Coastguard Worker #if 0
48*7c568831SAndroid Build Coastguard Worker #define DEBUG printf
49*7c568831SAndroid Build Coastguard Worker #else
50*7c568831SAndroid Build Coastguard Worker #define DEBUG(...)
51*7c568831SAndroid Build Coastguard Worker #endif
52*7c568831SAndroid Build Coastguard Worker
53*7c568831SAndroid Build Coastguard Worker #define MAX_CONTENT 100
54*7c568831SAndroid Build Coastguard Worker #define MAX_COPY_NODES 50
55*7c568831SAndroid Build Coastguard Worker #define MAX_COPY_OPS 20
56*7c568831SAndroid Build Coastguard Worker
57*7c568831SAndroid Build Coastguard Worker typedef enum {
58*7c568831SAndroid Build Coastguard Worker /* Basic operations */
59*7c568831SAndroid Build Coastguard Worker OP_CREATE_INTEGER,
60*7c568831SAndroid Build Coastguard Worker OP_CREATE_STRING,
61*7c568831SAndroid Build Coastguard Worker OP_DUP_INTEGER,
62*7c568831SAndroid Build Coastguard Worker OP_DUP_STRING,
63*7c568831SAndroid Build Coastguard Worker OP_DUP_NODE,
64*7c568831SAndroid Build Coastguard Worker
65*7c568831SAndroid Build Coastguard Worker /*** tree.h ***/
66*7c568831SAndroid Build Coastguard Worker
67*7c568831SAndroid Build Coastguard Worker /* Tree constructors */
68*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_DOC,
69*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_NODE,
70*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_NODE_EAT_NAME,
71*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_DOC_NODE,
72*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_DOC_NODE_EAT_NAME,
73*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_DOC_RAW_NODE,
74*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_CHILD,
75*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_TEXT_CHILD,
76*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_PROP,
77*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_DOC_PROP,
78*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_NS_PROP,
79*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_NS_PROP_EAT_NAME,
80*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_TEXT,
81*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_TEXT_LEN,
82*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_DOC_TEXT,
83*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_DOC_TEXT_LEN,
84*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_PI,
85*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_DOC_PI,
86*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_COMMENT,
87*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_DOC_COMMENT,
88*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_CDATA_BLOCK,
89*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_CHAR_REF,
90*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_REFERENCE,
91*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_DOC_FRAGMENT,
92*7c568831SAndroid Build Coastguard Worker OP_XML_CREATE_INT_SUBSET,
93*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_DTD,
94*7c568831SAndroid Build Coastguard Worker
95*7c568831SAndroid Build Coastguard Worker /* Node copying */
96*7c568831SAndroid Build Coastguard Worker OP_XML_COPY_DOC,
97*7c568831SAndroid Build Coastguard Worker OP_XML_COPY_NODE,
98*7c568831SAndroid Build Coastguard Worker OP_XML_COPY_NODE_LIST,
99*7c568831SAndroid Build Coastguard Worker OP_XML_DOC_COPY_NODE,
100*7c568831SAndroid Build Coastguard Worker OP_XML_DOC_COPY_NODE_LIST,
101*7c568831SAndroid Build Coastguard Worker OP_XML_COPY_PROP,
102*7c568831SAndroid Build Coastguard Worker OP_XML_COPY_PROP_LIST,
103*7c568831SAndroid Build Coastguard Worker OP_XML_COPY_DTD,
104*7c568831SAndroid Build Coastguard Worker
105*7c568831SAndroid Build Coastguard Worker /* Node accessors */
106*7c568831SAndroid Build Coastguard Worker OP_NODE_PARENT,
107*7c568831SAndroid Build Coastguard Worker OP_NODE_NEXT_SIBLING,
108*7c568831SAndroid Build Coastguard Worker OP_NODE_PREV_SIBLING,
109*7c568831SAndroid Build Coastguard Worker OP_NODE_FIRST_CHILD,
110*7c568831SAndroid Build Coastguard Worker OP_XML_GET_LAST_CHILD,
111*7c568831SAndroid Build Coastguard Worker OP_NODE_NAME,
112*7c568831SAndroid Build Coastguard Worker OP_XML_NODE_SET_NAME,
113*7c568831SAndroid Build Coastguard Worker OP_XML_NODE_GET_CONTENT,
114*7c568831SAndroid Build Coastguard Worker OP_XML_NODE_SET_CONTENT,
115*7c568831SAndroid Build Coastguard Worker OP_XML_NODE_SET_CONTENT_LEN,
116*7c568831SAndroid Build Coastguard Worker OP_XML_NODE_ADD_CONTENT,
117*7c568831SAndroid Build Coastguard Worker OP_XML_NODE_ADD_CONTENT_LEN,
118*7c568831SAndroid Build Coastguard Worker OP_XML_GET_INT_SUBSET,
119*7c568831SAndroid Build Coastguard Worker OP_XML_GET_LINE_NO,
120*7c568831SAndroid Build Coastguard Worker OP_XML_GET_NODE_PATH,
121*7c568831SAndroid Build Coastguard Worker OP_XML_DOC_GET_ROOT_ELEMENT,
122*7c568831SAndroid Build Coastguard Worker OP_XML_DOC_SET_ROOT_ELEMENT,
123*7c568831SAndroid Build Coastguard Worker OP_XML_NODE_IS_TEXT,
124*7c568831SAndroid Build Coastguard Worker OP_XML_NODE_GET_ATTR_VALUE,
125*7c568831SAndroid Build Coastguard Worker OP_XML_NODE_GET_LANG,
126*7c568831SAndroid Build Coastguard Worker OP_XML_NODE_SET_LANG,
127*7c568831SAndroid Build Coastguard Worker OP_XML_NODE_GET_SPACE_PRESERVE,
128*7c568831SAndroid Build Coastguard Worker OP_XML_NODE_SET_SPACE_PRESERVE,
129*7c568831SAndroid Build Coastguard Worker OP_XML_NODE_GET_BASE,
130*7c568831SAndroid Build Coastguard Worker OP_XML_NODE_GET_BASE_SAFE,
131*7c568831SAndroid Build Coastguard Worker OP_XML_NODE_SET_BASE,
132*7c568831SAndroid Build Coastguard Worker OP_XML_IS_BLANK_NODE,
133*7c568831SAndroid Build Coastguard Worker
134*7c568831SAndroid Build Coastguard Worker /* Attributes */
135*7c568831SAndroid Build Coastguard Worker OP_XML_HAS_PROP,
136*7c568831SAndroid Build Coastguard Worker OP_XML_HAS_NS_PROP,
137*7c568831SAndroid Build Coastguard Worker OP_XML_GET_PROP,
138*7c568831SAndroid Build Coastguard Worker OP_XML_GET_NS_PROP,
139*7c568831SAndroid Build Coastguard Worker OP_XML_GET_NO_NS_PROP,
140*7c568831SAndroid Build Coastguard Worker OP_XML_SET_PROP,
141*7c568831SAndroid Build Coastguard Worker OP_XML_SET_NS_PROP,
142*7c568831SAndroid Build Coastguard Worker OP_XML_REMOVE_PROP,
143*7c568831SAndroid Build Coastguard Worker OP_XML_UNSET_PROP,
144*7c568831SAndroid Build Coastguard Worker OP_XML_UNSET_NS_PROP,
145*7c568831SAndroid Build Coastguard Worker
146*7c568831SAndroid Build Coastguard Worker /* Namespaces */
147*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_NS,
148*7c568831SAndroid Build Coastguard Worker OP_XML_SEARCH_NS,
149*7c568831SAndroid Build Coastguard Worker OP_XML_SEARCH_NS_BY_HREF,
150*7c568831SAndroid Build Coastguard Worker OP_XML_GET_NS_LIST,
151*7c568831SAndroid Build Coastguard Worker OP_XML_GET_NS_LIST_SAFE,
152*7c568831SAndroid Build Coastguard Worker OP_XML_SET_NS,
153*7c568831SAndroid Build Coastguard Worker OP_XML_COPY_NAMESPACE,
154*7c568831SAndroid Build Coastguard Worker OP_XML_COPY_NAMESPACE_LIST,
155*7c568831SAndroid Build Coastguard Worker
156*7c568831SAndroid Build Coastguard Worker /* Tree manipulation */
157*7c568831SAndroid Build Coastguard Worker OP_XML_UNLINK_NODE,
158*7c568831SAndroid Build Coastguard Worker OP_XML_ADD_CHILD,
159*7c568831SAndroid Build Coastguard Worker OP_XML_ADD_CHILD_LIST,
160*7c568831SAndroid Build Coastguard Worker OP_XML_REPLACE_NODE,
161*7c568831SAndroid Build Coastguard Worker OP_XML_ADD_SIBLING,
162*7c568831SAndroid Build Coastguard Worker OP_XML_ADD_PREV_SIBLING,
163*7c568831SAndroid Build Coastguard Worker OP_XML_ADD_NEXT_SIBLING,
164*7c568831SAndroid Build Coastguard Worker
165*7c568831SAndroid Build Coastguard Worker /* String output */
166*7c568831SAndroid Build Coastguard Worker OP_XML_DOC_DUMP_MEMORY,
167*7c568831SAndroid Build Coastguard Worker OP_XML_DOC_DUMP_MEMORY_ENC,
168*7c568831SAndroid Build Coastguard Worker OP_XML_DOC_DUMP_FORMAT_MEMORY,
169*7c568831SAndroid Build Coastguard Worker OP_XML_DOC_DUMP_FORMAT_MEMORY_ENC,
170*7c568831SAndroid Build Coastguard Worker
171*7c568831SAndroid Build Coastguard Worker /* FILE output, TODO, use fmemopen */
172*7c568831SAndroid Build Coastguard Worker OP_XML_DOC_DUMP,
173*7c568831SAndroid Build Coastguard Worker OP_XML_DOC_FORMAT_DUMP,
174*7c568831SAndroid Build Coastguard Worker OP_XML_ELEM_DUMP,
175*7c568831SAndroid Build Coastguard Worker
176*7c568831SAndroid Build Coastguard Worker /* xmlBuf output, TODO, no public API */
177*7c568831SAndroid Build Coastguard Worker OP_XML_BUF_NODE_DUMP,
178*7c568831SAndroid Build Coastguard Worker OP_XML_BUF_GET_NODE_CONTENT,
179*7c568831SAndroid Build Coastguard Worker
180*7c568831SAndroid Build Coastguard Worker /* xmlBuffer output */
181*7c568831SAndroid Build Coastguard Worker OP_XML_NODE_DUMP,
182*7c568831SAndroid Build Coastguard Worker OP_XML_NODE_BUF_GET_CONTENT,
183*7c568831SAndroid Build Coastguard Worker OP_XML_ATTR_SERIALIZE_TXT_CONTENT,
184*7c568831SAndroid Build Coastguard Worker OP_XML_DUMP_ELEMENT_DECL,
185*7c568831SAndroid Build Coastguard Worker OP_XML_DUMP_ELEMENT_TABLE,
186*7c568831SAndroid Build Coastguard Worker OP_XML_DUMP_ATTRIBUTE_DECL,
187*7c568831SAndroid Build Coastguard Worker OP_XML_DUMP_ATTRIBUTE_TABLE,
188*7c568831SAndroid Build Coastguard Worker OP_XML_DUMP_NOTATION_DECL,
189*7c568831SAndroid Build Coastguard Worker OP_XML_DUMP_NOTATION_TABLE,
190*7c568831SAndroid Build Coastguard Worker OP_XML_DUMP_ENTITY_DECL,
191*7c568831SAndroid Build Coastguard Worker OP_XML_DUMP_ENTITIES_TABLE,
192*7c568831SAndroid Build Coastguard Worker
193*7c568831SAndroid Build Coastguard Worker /* xmlOutputBuffer */
194*7c568831SAndroid Build Coastguard Worker OP_XML_SAVE_FILE_TO,
195*7c568831SAndroid Build Coastguard Worker OP_XML_SAVE_FORMAT_FILE_TO,
196*7c568831SAndroid Build Coastguard Worker OP_XML_NODE_DUMP_OUTPUT,
197*7c568831SAndroid Build Coastguard Worker
198*7c568831SAndroid Build Coastguard Worker /* Misc */
199*7c568831SAndroid Build Coastguard Worker OP_XML_TEXT_MERGE,
200*7c568831SAndroid Build Coastguard Worker OP_XML_TEXT_CONCAT,
201*7c568831SAndroid Build Coastguard Worker OP_XML_STRING_GET_NODE_LIST,
202*7c568831SAndroid Build Coastguard Worker OP_XML_STRING_LEN_GET_NODE_LIST,
203*7c568831SAndroid Build Coastguard Worker OP_XML_NODE_LIST_GET_STRING,
204*7c568831SAndroid Build Coastguard Worker OP_XML_NODE_LIST_GET_RAW_STRING,
205*7c568831SAndroid Build Coastguard Worker OP_XML_IS_XHTML,
206*7c568831SAndroid Build Coastguard Worker
207*7c568831SAndroid Build Coastguard Worker /* DOM */
208*7c568831SAndroid Build Coastguard Worker OP_XML_DOM_WRAP_RECONCILE_NAMESPACES,
209*7c568831SAndroid Build Coastguard Worker OP_XML_DOM_WRAP_ADOPT_NODE,
210*7c568831SAndroid Build Coastguard Worker OP_XML_DOM_WRAP_REMOVE_NODE,
211*7c568831SAndroid Build Coastguard Worker OP_XML_DOM_WRAP_CLONE_NODE,
212*7c568831SAndroid Build Coastguard Worker OP_XML_CHILD_ELEMENT_COUNT,
213*7c568831SAndroid Build Coastguard Worker OP_XML_FIRST_ELEMENT_CHILD,
214*7c568831SAndroid Build Coastguard Worker OP_XML_LAST_ELEMENT_CHILD,
215*7c568831SAndroid Build Coastguard Worker OP_XML_NEXT_ELEMENT_SIBLING,
216*7c568831SAndroid Build Coastguard Worker OP_XML_PREVIOUS_ELEMENT_SIBLING,
217*7c568831SAndroid Build Coastguard Worker
218*7c568831SAndroid Build Coastguard Worker /*** parser.h ***/
219*7c568831SAndroid Build Coastguard Worker
220*7c568831SAndroid Build Coastguard Worker OP_PARSE_DOCUMENT,
221*7c568831SAndroid Build Coastguard Worker
222*7c568831SAndroid Build Coastguard Worker /*** valid.h ***/
223*7c568831SAndroid Build Coastguard Worker
224*7c568831SAndroid Build Coastguard Worker OP_XML_ADD_ELEMENT_DECL,
225*7c568831SAndroid Build Coastguard Worker OP_XML_ADD_ATTRIBUTE_DECL,
226*7c568831SAndroid Build Coastguard Worker OP_XML_ADD_NOTATION_DECL,
227*7c568831SAndroid Build Coastguard Worker
228*7c568831SAndroid Build Coastguard Worker OP_XML_GET_DTD_ELEMENT_DESC,
229*7c568831SAndroid Build Coastguard Worker OP_XML_GET_DTD_QELEMENT_DESC,
230*7c568831SAndroid Build Coastguard Worker OP_XML_GET_DTD_ATTR_DESC,
231*7c568831SAndroid Build Coastguard Worker OP_XML_GET_DTD_QATTR_DESC,
232*7c568831SAndroid Build Coastguard Worker OP_XML_GET_DTD_NOTATION_DESC,
233*7c568831SAndroid Build Coastguard Worker
234*7c568831SAndroid Build Coastguard Worker OP_XML_ADD_ID,
235*7c568831SAndroid Build Coastguard Worker OP_XML_ADD_ID_SAFE,
236*7c568831SAndroid Build Coastguard Worker OP_XML_GET_ID,
237*7c568831SAndroid Build Coastguard Worker OP_XML_IS_ID,
238*7c568831SAndroid Build Coastguard Worker OP_XML_REMOVE_ID,
239*7c568831SAndroid Build Coastguard Worker
240*7c568831SAndroid Build Coastguard Worker OP_XML_ADD_REF,
241*7c568831SAndroid Build Coastguard Worker OP_XML_GET_REFS,
242*7c568831SAndroid Build Coastguard Worker OP_XML_IS_REF,
243*7c568831SAndroid Build Coastguard Worker OP_XML_REMOVE_REF,
244*7c568831SAndroid Build Coastguard Worker
245*7c568831SAndroid Build Coastguard Worker OP_XML_IS_MIXED_ELEMENT,
246*7c568831SAndroid Build Coastguard Worker
247*7c568831SAndroid Build Coastguard Worker OP_VALIDATE,
248*7c568831SAndroid Build Coastguard Worker OP_XML_VALIDATE_ATTRIBUTE_VALUE,
249*7c568831SAndroid Build Coastguard Worker OP_XML_VALIDATE_DTD,
250*7c568831SAndroid Build Coastguard Worker OP_XML_VALIDATE_NOTATION_USE,
251*7c568831SAndroid Build Coastguard Worker
252*7c568831SAndroid Build Coastguard Worker OP_XML_VALIDATE_NAME_VALUE,
253*7c568831SAndroid Build Coastguard Worker OP_XML_VALIDATE_NAMES_VALUE,
254*7c568831SAndroid Build Coastguard Worker OP_XML_VALIDATE_NMTOKEN_VALUE,
255*7c568831SAndroid Build Coastguard Worker OP_XML_VALIDATE_NMTOKENS_VALUE,
256*7c568831SAndroid Build Coastguard Worker
257*7c568831SAndroid Build Coastguard Worker OP_XML_VALID_NORMALIZE_ATTRIBUTE_VALUE,
258*7c568831SAndroid Build Coastguard Worker OP_XML_VALID_CTXT_NORMALIZE_ATTRIBUTE_VALUE,
259*7c568831SAndroid Build Coastguard Worker OP_XML_VALID_GET_POTENTIAL_CHILDREN,
260*7c568831SAndroid Build Coastguard Worker OP_XML_VALID_GET_VALID_ELEMENTS,
261*7c568831SAndroid Build Coastguard Worker
262*7c568831SAndroid Build Coastguard Worker /*** entities.h ***/
263*7c568831SAndroid Build Coastguard Worker
264*7c568831SAndroid Build Coastguard Worker OP_XML_NEW_ENTITY,
265*7c568831SAndroid Build Coastguard Worker OP_XML_ADD_ENTITY,
266*7c568831SAndroid Build Coastguard Worker OP_XML_ADD_DOC_ENTITY,
267*7c568831SAndroid Build Coastguard Worker OP_XML_ADD_DTD_ENTITY,
268*7c568831SAndroid Build Coastguard Worker
269*7c568831SAndroid Build Coastguard Worker OP_XML_GET_PREDEFINED_ENTITY,
270*7c568831SAndroid Build Coastguard Worker OP_XML_GET_DOC_ENTITY,
271*7c568831SAndroid Build Coastguard Worker OP_XML_GET_DTD_ENTITY,
272*7c568831SAndroid Build Coastguard Worker OP_XML_GET_PARAMETER_ENTITY,
273*7c568831SAndroid Build Coastguard Worker
274*7c568831SAndroid Build Coastguard Worker OP_XML_ENCODE_ENTITIES_REENTRANT,
275*7c568831SAndroid Build Coastguard Worker OP_XML_ENCODE_SPECIAL_CHARS,
276*7c568831SAndroid Build Coastguard Worker
277*7c568831SAndroid Build Coastguard Worker /*** HTMLtree.h ***/
278*7c568831SAndroid Build Coastguard Worker
279*7c568831SAndroid Build Coastguard Worker OP_HTML_NEW_DOC,
280*7c568831SAndroid Build Coastguard Worker OP_HTML_NEW_DOC_NO_DTD,
281*7c568831SAndroid Build Coastguard Worker OP_HTML_GET_META_ENCODING,
282*7c568831SAndroid Build Coastguard Worker OP_HTML_SET_META_ENCODING,
283*7c568831SAndroid Build Coastguard Worker OP_HTML_IS_BOOLEAN_ATTR,
284*7c568831SAndroid Build Coastguard Worker
285*7c568831SAndroid Build Coastguard Worker OP_HTML_DOC_DUMP_MEMORY,
286*7c568831SAndroid Build Coastguard Worker OP_HTML_DOC_DUMP_MEMORY_FORMAT,
287*7c568831SAndroid Build Coastguard Worker OP_HTML_DOC_DUMP,
288*7c568831SAndroid Build Coastguard Worker OP_HTML_NODE_DUMP_FILE,
289*7c568831SAndroid Build Coastguard Worker OP_HTML_NODE_DUMP_FILE_FORMAT,
290*7c568831SAndroid Build Coastguard Worker OP_HTML_NODE_DUMP,
291*7c568831SAndroid Build Coastguard Worker OP_HTML_DOC_CONTENT_DUMP_OUTPUT,
292*7c568831SAndroid Build Coastguard Worker OP_HTML_DOC_CONTENT_DUMP_FORMAT_OUTPUT,
293*7c568831SAndroid Build Coastguard Worker OP_HTML_NODE_DUMP_OUTPUT,
294*7c568831SAndroid Build Coastguard Worker OP_HTML_NODE_DUMP_FORMAT_OUTPUT,
295*7c568831SAndroid Build Coastguard Worker
296*7c568831SAndroid Build Coastguard Worker OP_MAX
297*7c568831SAndroid Build Coastguard Worker } opType;
298*7c568831SAndroid Build Coastguard Worker
299*7c568831SAndroid Build Coastguard Worker #define NODE_MASK_TEXT_CONTENT ( \
300*7c568831SAndroid Build Coastguard Worker (1 << XML_TEXT_NODE) | \
301*7c568831SAndroid Build Coastguard Worker (1 << XML_CDATA_SECTION_NODE) | \
302*7c568831SAndroid Build Coastguard Worker (1 << XML_COMMENT_NODE) | \
303*7c568831SAndroid Build Coastguard Worker (1 << XML_PI_NODE))
304*7c568831SAndroid Build Coastguard Worker
305*7c568831SAndroid Build Coastguard Worker #define CHILD_MASK_DOCUMENT ( \
306*7c568831SAndroid Build Coastguard Worker (1 << XML_ELEMENT_NODE) | \
307*7c568831SAndroid Build Coastguard Worker (1 << XML_PI_NODE) | \
308*7c568831SAndroid Build Coastguard Worker (1 << XML_COMMENT_NODE))
309*7c568831SAndroid Build Coastguard Worker
310*7c568831SAndroid Build Coastguard Worker #define CHILD_MASK_CONTENT ( \
311*7c568831SAndroid Build Coastguard Worker (1 << XML_ELEMENT_NODE) | \
312*7c568831SAndroid Build Coastguard Worker (1 << XML_TEXT_NODE) | \
313*7c568831SAndroid Build Coastguard Worker (1 << XML_CDATA_SECTION_NODE) | \
314*7c568831SAndroid Build Coastguard Worker (1 << XML_ENTITY_REF_NODE) | \
315*7c568831SAndroid Build Coastguard Worker (1 << XML_PI_NODE) | \
316*7c568831SAndroid Build Coastguard Worker (1 << XML_COMMENT_NODE))
317*7c568831SAndroid Build Coastguard Worker
318*7c568831SAndroid Build Coastguard Worker #define CHILD_MASK_ELEMENT ( \
319*7c568831SAndroid Build Coastguard Worker CHILD_MASK_CONTENT | \
320*7c568831SAndroid Build Coastguard Worker (1 << XML_ATTRIBUTE_NODE))
321*7c568831SAndroid Build Coastguard Worker
322*7c568831SAndroid Build Coastguard Worker #define CHILD_MASK_ATTRIBUTE ( \
323*7c568831SAndroid Build Coastguard Worker (1 << XML_TEXT_NODE) | \
324*7c568831SAndroid Build Coastguard Worker (1 << XML_ENTITY_REF_NODE))
325*7c568831SAndroid Build Coastguard Worker
326*7c568831SAndroid Build Coastguard Worker #define CHILD_MASK_DTD ( \
327*7c568831SAndroid Build Coastguard Worker (1 << XML_ELEMENT_DECL) | \
328*7c568831SAndroid Build Coastguard Worker (1 << XML_ATTRIBUTE_DECL) | \
329*7c568831SAndroid Build Coastguard Worker (1 << XML_ENTITY_DECL))
330*7c568831SAndroid Build Coastguard Worker
331*7c568831SAndroid Build Coastguard Worker static const int childMasks[] = {
332*7c568831SAndroid Build Coastguard Worker 0,
333*7c568831SAndroid Build Coastguard Worker CHILD_MASK_ELEMENT, /* XML_ELEMENT_NODE */
334*7c568831SAndroid Build Coastguard Worker CHILD_MASK_ATTRIBUTE, /* XML_ATTRIBUTE_NODE */
335*7c568831SAndroid Build Coastguard Worker 0, /* XML_TEXT_NODE */
336*7c568831SAndroid Build Coastguard Worker 0, /* XML_CDATA_SECTION_NODE */
337*7c568831SAndroid Build Coastguard Worker 0, /* XML_ENTITY_REF_NODE */
338*7c568831SAndroid Build Coastguard Worker 0, /* XML_ENTITY_NODE */
339*7c568831SAndroid Build Coastguard Worker 0, /* XML_PI_NODE */
340*7c568831SAndroid Build Coastguard Worker 0, /* XML_COMMENT_NODE */
341*7c568831SAndroid Build Coastguard Worker CHILD_MASK_DOCUMENT, /* XML_DOCUMENT_NODE */
342*7c568831SAndroid Build Coastguard Worker 0, /* XML_DOCUMENT_TYPE_NODE */
343*7c568831SAndroid Build Coastguard Worker CHILD_MASK_CONTENT, /* XML_DOCUMENT_FRAG_NODE */
344*7c568831SAndroid Build Coastguard Worker 0, /* XML_NOTATION_NODE */
345*7c568831SAndroid Build Coastguard Worker CHILD_MASK_DOCUMENT, /* XML_HTML_DOCUMENT_NODE */
346*7c568831SAndroid Build Coastguard Worker 0, /* XML_DTD_NODE */
347*7c568831SAndroid Build Coastguard Worker 0, /* XML_ELEMENT_DECL */
348*7c568831SAndroid Build Coastguard Worker 0, /* XML_ATTRIBUTE_DECL */
349*7c568831SAndroid Build Coastguard Worker 0, /* XML_ENTITY_DECL */
350*7c568831SAndroid Build Coastguard Worker 0, /* XML_NAMESPACE_DECL */
351*7c568831SAndroid Build Coastguard Worker 0, /* XML_XINCLUDE_START */
352*7c568831SAndroid Build Coastguard Worker 0, /* XML_XINCLUDE_END */
353*7c568831SAndroid Build Coastguard Worker CHILD_MASK_DOCUMENT /* XML_DOCB_DOCUMENT_NODE */
354*7c568831SAndroid Build Coastguard Worker };
355*7c568831SAndroid Build Coastguard Worker
356*7c568831SAndroid Build Coastguard Worker #define REG_MAX 8
357*7c568831SAndroid Build Coastguard Worker #define REG_MASK (REG_MAX - 1)
358*7c568831SAndroid Build Coastguard Worker
359*7c568831SAndroid Build Coastguard Worker typedef struct {
360*7c568831SAndroid Build Coastguard Worker /* Indexes point beyond the most recent item */
361*7c568831SAndroid Build Coastguard Worker int intIdx;
362*7c568831SAndroid Build Coastguard Worker int stringIdx;
363*7c568831SAndroid Build Coastguard Worker int nodeIdx;
364*7c568831SAndroid Build Coastguard Worker
365*7c568831SAndroid Build Coastguard Worker int numCopyOps;
366*7c568831SAndroid Build Coastguard Worker
367*7c568831SAndroid Build Coastguard Worker const char *opName;
368*7c568831SAndroid Build Coastguard Worker
369*7c568831SAndroid Build Coastguard Worker /* Registers */
370*7c568831SAndroid Build Coastguard Worker int integers[REG_MAX];
371*7c568831SAndroid Build Coastguard Worker xmlChar *strings[REG_MAX];
372*7c568831SAndroid Build Coastguard Worker xmlNodePtr nodes[REG_MAX];
373*7c568831SAndroid Build Coastguard Worker } xmlFuzzApiVars;
374*7c568831SAndroid Build Coastguard Worker
375*7c568831SAndroid Build Coastguard Worker static xmlFuzzApiVars varsStruct;
376*7c568831SAndroid Build Coastguard Worker static xmlFuzzApiVars *const vars = &varsStruct;
377*7c568831SAndroid Build Coastguard Worker
378*7c568831SAndroid Build Coastguard Worker /* Debug output */
379*7c568831SAndroid Build Coastguard Worker
380*7c568831SAndroid Build Coastguard Worker static void
startOp(const char * name)381*7c568831SAndroid Build Coastguard Worker startOp(const char *name) {
382*7c568831SAndroid Build Coastguard Worker vars->opName = name;
383*7c568831SAndroid Build Coastguard Worker DEBUG("%s(", name);
384*7c568831SAndroid Build Coastguard Worker }
385*7c568831SAndroid Build Coastguard Worker
386*7c568831SAndroid Build Coastguard Worker static void
endOp(void)387*7c568831SAndroid Build Coastguard Worker endOp(void) {
388*7c568831SAndroid Build Coastguard Worker DEBUG(" )\n");
389*7c568831SAndroid Build Coastguard Worker }
390*7c568831SAndroid Build Coastguard Worker
391*7c568831SAndroid Build Coastguard Worker /* Integers */
392*7c568831SAndroid Build Coastguard Worker
393*7c568831SAndroid Build Coastguard Worker static int
getInt(int offset)394*7c568831SAndroid Build Coastguard Worker getInt(int offset) {
395*7c568831SAndroid Build Coastguard Worker int idx = (vars->intIdx - offset - 1) & REG_MASK;
396*7c568831SAndroid Build Coastguard Worker DEBUG(" %d", vars->integers[idx]);
397*7c568831SAndroid Build Coastguard Worker return vars->integers[idx];
398*7c568831SAndroid Build Coastguard Worker }
399*7c568831SAndroid Build Coastguard Worker
400*7c568831SAndroid Build Coastguard Worker static void
setInt(int offset,int n)401*7c568831SAndroid Build Coastguard Worker setInt(int offset, int n) {
402*7c568831SAndroid Build Coastguard Worker int idx = (vars->intIdx - offset - 1) & REG_MASK;
403*7c568831SAndroid Build Coastguard Worker vars->integers[idx] = n;
404*7c568831SAndroid Build Coastguard Worker }
405*7c568831SAndroid Build Coastguard Worker
406*7c568831SAndroid Build Coastguard Worker static void
incIntIdx(void)407*7c568831SAndroid Build Coastguard Worker incIntIdx(void) {
408*7c568831SAndroid Build Coastguard Worker vars->intIdx = (vars->intIdx + 1) & REG_MASK;
409*7c568831SAndroid Build Coastguard Worker }
410*7c568831SAndroid Build Coastguard Worker
411*7c568831SAndroid Build Coastguard Worker /* Strings */
412*7c568831SAndroid Build Coastguard Worker
413*7c568831SAndroid Build Coastguard Worker static const xmlChar *
getStr(int offset)414*7c568831SAndroid Build Coastguard Worker getStr(int offset) {
415*7c568831SAndroid Build Coastguard Worker int idx = (vars->stringIdx - offset - 1) & REG_MASK;
416*7c568831SAndroid Build Coastguard Worker const xmlChar *str = vars->strings[idx];
417*7c568831SAndroid Build Coastguard Worker
418*7c568831SAndroid Build Coastguard Worker if (str == NULL)
419*7c568831SAndroid Build Coastguard Worker DEBUG(" NULL");
420*7c568831SAndroid Build Coastguard Worker else
421*7c568831SAndroid Build Coastguard Worker DEBUG(" \"%.20s\"", str);
422*7c568831SAndroid Build Coastguard Worker
423*7c568831SAndroid Build Coastguard Worker return str;
424*7c568831SAndroid Build Coastguard Worker }
425*7c568831SAndroid Build Coastguard Worker
426*7c568831SAndroid Build Coastguard Worker static const char *
getCStr(int offset)427*7c568831SAndroid Build Coastguard Worker getCStr(int offset) {
428*7c568831SAndroid Build Coastguard Worker return (const char *) getStr(offset);
429*7c568831SAndroid Build Coastguard Worker }
430*7c568831SAndroid Build Coastguard Worker
431*7c568831SAndroid Build Coastguard Worker static void
setStr(int offset,xmlChar * str)432*7c568831SAndroid Build Coastguard Worker setStr(int offset, xmlChar *str) {
433*7c568831SAndroid Build Coastguard Worker xmlChar **strings = vars->strings;
434*7c568831SAndroid Build Coastguard Worker int idx = (vars->stringIdx - offset - 1) & REG_MASK;
435*7c568831SAndroid Build Coastguard Worker xmlChar *oldString = strings[idx];
436*7c568831SAndroid Build Coastguard Worker
437*7c568831SAndroid Build Coastguard Worker strings[idx] = str;
438*7c568831SAndroid Build Coastguard Worker if (oldString)
439*7c568831SAndroid Build Coastguard Worker xmlFree(oldString);
440*7c568831SAndroid Build Coastguard Worker }
441*7c568831SAndroid Build Coastguard Worker
442*7c568831SAndroid Build Coastguard Worker static void
moveStr(int offset,xmlChar * str)443*7c568831SAndroid Build Coastguard Worker moveStr(int offset, xmlChar *str) {
444*7c568831SAndroid Build Coastguard Worker if (xmlStrlen(str) > 1000) {
445*7c568831SAndroid Build Coastguard Worker setStr(offset, NULL);
446*7c568831SAndroid Build Coastguard Worker xmlFree(str);
447*7c568831SAndroid Build Coastguard Worker } else {
448*7c568831SAndroid Build Coastguard Worker setStr(offset, str);
449*7c568831SAndroid Build Coastguard Worker }
450*7c568831SAndroid Build Coastguard Worker }
451*7c568831SAndroid Build Coastguard Worker
452*7c568831SAndroid Build Coastguard Worker /*
453*7c568831SAndroid Build Coastguard Worker * This doesn't use xmlMalloc and can't fail because of malloc failure
454*7c568831SAndroid Build Coastguard Worker * injection.
455*7c568831SAndroid Build Coastguard Worker */
456*7c568831SAndroid Build Coastguard Worker static xmlChar *
uncheckedStrndup(const xmlChar * str,int size)457*7c568831SAndroid Build Coastguard Worker uncheckedStrndup(const xmlChar *str, int size) {
458*7c568831SAndroid Build Coastguard Worker xmlChar *copy;
459*7c568831SAndroid Build Coastguard Worker
460*7c568831SAndroid Build Coastguard Worker if (str == NULL)
461*7c568831SAndroid Build Coastguard Worker return NULL;
462*7c568831SAndroid Build Coastguard Worker
463*7c568831SAndroid Build Coastguard Worker copy = BAD_CAST strndup((const char *) str, size);
464*7c568831SAndroid Build Coastguard Worker if (copy == NULL) {
465*7c568831SAndroid Build Coastguard Worker fprintf(stderr, "out of memory\n");
466*7c568831SAndroid Build Coastguard Worker abort();
467*7c568831SAndroid Build Coastguard Worker }
468*7c568831SAndroid Build Coastguard Worker
469*7c568831SAndroid Build Coastguard Worker return copy;
470*7c568831SAndroid Build Coastguard Worker }
471*7c568831SAndroid Build Coastguard Worker
472*7c568831SAndroid Build Coastguard Worker static xmlChar *
uncheckedStrdup(const xmlChar * str)473*7c568831SAndroid Build Coastguard Worker uncheckedStrdup(const xmlChar *str) {
474*7c568831SAndroid Build Coastguard Worker return uncheckedStrndup(str, MAX_CONTENT);
475*7c568831SAndroid Build Coastguard Worker }
476*7c568831SAndroid Build Coastguard Worker
477*7c568831SAndroid Build Coastguard Worker static void
copyStr(int offset,const xmlChar * str)478*7c568831SAndroid Build Coastguard Worker copyStr(int offset, const xmlChar *str) {
479*7c568831SAndroid Build Coastguard Worker setStr(offset, uncheckedStrdup(str));
480*7c568831SAndroid Build Coastguard Worker }
481*7c568831SAndroid Build Coastguard Worker
482*7c568831SAndroid Build Coastguard Worker static void
incStrIdx(void)483*7c568831SAndroid Build Coastguard Worker incStrIdx(void) {
484*7c568831SAndroid Build Coastguard Worker vars->stringIdx = (vars->stringIdx + 1) & REG_MASK;
485*7c568831SAndroid Build Coastguard Worker }
486*7c568831SAndroid Build Coastguard Worker
487*7c568831SAndroid Build Coastguard Worker /* Nodes */
488*7c568831SAndroid Build Coastguard Worker
489*7c568831SAndroid Build Coastguard Worker static void
490*7c568831SAndroid Build Coastguard Worker dropNode(xmlNodePtr node);
491*7c568831SAndroid Build Coastguard Worker
492*7c568831SAndroid Build Coastguard Worker static xmlNodePtr
getNode(int offset)493*7c568831SAndroid Build Coastguard Worker getNode(int offset) {
494*7c568831SAndroid Build Coastguard Worker int idx = (vars->nodeIdx - offset - 1) & REG_MASK;
495*7c568831SAndroid Build Coastguard Worker if (vars->nodes[idx])
496*7c568831SAndroid Build Coastguard Worker DEBUG(" n%d", idx);
497*7c568831SAndroid Build Coastguard Worker else
498*7c568831SAndroid Build Coastguard Worker DEBUG(" NULL");
499*7c568831SAndroid Build Coastguard Worker fflush(stdout);
500*7c568831SAndroid Build Coastguard Worker return vars->nodes[idx];
501*7c568831SAndroid Build Coastguard Worker }
502*7c568831SAndroid Build Coastguard Worker
503*7c568831SAndroid Build Coastguard Worker static xmlDocPtr
getDoc(int offset)504*7c568831SAndroid Build Coastguard Worker getDoc(int offset) {
505*7c568831SAndroid Build Coastguard Worker xmlNodePtr node = getNode(offset);
506*7c568831SAndroid Build Coastguard Worker
507*7c568831SAndroid Build Coastguard Worker if (node == NULL)
508*7c568831SAndroid Build Coastguard Worker return NULL;
509*7c568831SAndroid Build Coastguard Worker return node->doc;
510*7c568831SAndroid Build Coastguard Worker }
511*7c568831SAndroid Build Coastguard Worker
512*7c568831SAndroid Build Coastguard Worker static xmlAttrPtr
getAttr(int offset)513*7c568831SAndroid Build Coastguard Worker getAttr(int offset) {
514*7c568831SAndroid Build Coastguard Worker xmlNodePtr node = getNode(offset);
515*7c568831SAndroid Build Coastguard Worker
516*7c568831SAndroid Build Coastguard Worker if (node == NULL)
517*7c568831SAndroid Build Coastguard Worker return NULL;
518*7c568831SAndroid Build Coastguard Worker if (node->type == XML_ATTRIBUTE_NODE)
519*7c568831SAndroid Build Coastguard Worker return (xmlAttrPtr) node;
520*7c568831SAndroid Build Coastguard Worker if (node->type == XML_ELEMENT_NODE)
521*7c568831SAndroid Build Coastguard Worker return node->properties;
522*7c568831SAndroid Build Coastguard Worker
523*7c568831SAndroid Build Coastguard Worker return NULL;
524*7c568831SAndroid Build Coastguard Worker }
525*7c568831SAndroid Build Coastguard Worker
526*7c568831SAndroid Build Coastguard Worker static xmlDtdPtr
getDtd(int offset)527*7c568831SAndroid Build Coastguard Worker getDtd(int offset) {
528*7c568831SAndroid Build Coastguard Worker xmlNodePtr node = getNode(offset);
529*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
530*7c568831SAndroid Build Coastguard Worker
531*7c568831SAndroid Build Coastguard Worker if (node == NULL)
532*7c568831SAndroid Build Coastguard Worker return NULL;
533*7c568831SAndroid Build Coastguard Worker
534*7c568831SAndroid Build Coastguard Worker if (node->type == XML_DTD_NODE)
535*7c568831SAndroid Build Coastguard Worker return (xmlDtdPtr) node;
536*7c568831SAndroid Build Coastguard Worker
537*7c568831SAndroid Build Coastguard Worker doc = node->doc;
538*7c568831SAndroid Build Coastguard Worker if (doc == NULL)
539*7c568831SAndroid Build Coastguard Worker return NULL;
540*7c568831SAndroid Build Coastguard Worker if (doc->intSubset != NULL)
541*7c568831SAndroid Build Coastguard Worker return doc->intSubset;
542*7c568831SAndroid Build Coastguard Worker return doc->extSubset;
543*7c568831SAndroid Build Coastguard Worker }
544*7c568831SAndroid Build Coastguard Worker
545*7c568831SAndroid Build Coastguard Worker static void
setNode(int offset,xmlNodePtr node)546*7c568831SAndroid Build Coastguard Worker setNode(int offset, xmlNodePtr node) {
547*7c568831SAndroid Build Coastguard Worker int idx = (vars->nodeIdx - offset - 1) & REG_MASK;
548*7c568831SAndroid Build Coastguard Worker xmlNodePtr oldNode = vars->nodes[idx];
549*7c568831SAndroid Build Coastguard Worker
550*7c568831SAndroid Build Coastguard Worker if (node != oldNode) {
551*7c568831SAndroid Build Coastguard Worker vars->nodes[idx] = node;
552*7c568831SAndroid Build Coastguard Worker dropNode(oldNode);
553*7c568831SAndroid Build Coastguard Worker }
554*7c568831SAndroid Build Coastguard Worker
555*7c568831SAndroid Build Coastguard Worker if (node == NULL)
556*7c568831SAndroid Build Coastguard Worker DEBUG(" ) /* NULL */\n");
557*7c568831SAndroid Build Coastguard Worker else
558*7c568831SAndroid Build Coastguard Worker DEBUG(" ) -> n%d\n", idx);
559*7c568831SAndroid Build Coastguard Worker }
560*7c568831SAndroid Build Coastguard Worker
561*7c568831SAndroid Build Coastguard Worker static void
incNodeIdx(void)562*7c568831SAndroid Build Coastguard Worker incNodeIdx(void) {
563*7c568831SAndroid Build Coastguard Worker xmlNodePtr oldNode;
564*7c568831SAndroid Build Coastguard Worker int idx;
565*7c568831SAndroid Build Coastguard Worker
566*7c568831SAndroid Build Coastguard Worker idx = vars->nodeIdx & REG_MASK;
567*7c568831SAndroid Build Coastguard Worker vars->nodeIdx = (idx + 1) & REG_MASK;
568*7c568831SAndroid Build Coastguard Worker oldNode = vars->nodes[idx];
569*7c568831SAndroid Build Coastguard Worker
570*7c568831SAndroid Build Coastguard Worker if (oldNode != NULL) {
571*7c568831SAndroid Build Coastguard Worker vars->nodes[idx] = NULL;
572*7c568831SAndroid Build Coastguard Worker dropNode(oldNode);
573*7c568831SAndroid Build Coastguard Worker }
574*7c568831SAndroid Build Coastguard Worker }
575*7c568831SAndroid Build Coastguard Worker
576*7c568831SAndroid Build Coastguard Worker static int
isValidChildType(xmlNodePtr parent,int childType)577*7c568831SAndroid Build Coastguard Worker isValidChildType(xmlNodePtr parent, int childType) {
578*7c568831SAndroid Build Coastguard Worker return ((1 << childType) & childMasks[parent->type]) != 0;
579*7c568831SAndroid Build Coastguard Worker }
580*7c568831SAndroid Build Coastguard Worker
581*7c568831SAndroid Build Coastguard Worker static int
isValidChild(xmlNodePtr parent,xmlNodePtr child)582*7c568831SAndroid Build Coastguard Worker isValidChild(xmlNodePtr parent, xmlNodePtr child) {
583*7c568831SAndroid Build Coastguard Worker xmlNodePtr cur;
584*7c568831SAndroid Build Coastguard Worker
585*7c568831SAndroid Build Coastguard Worker if (child == NULL || parent == NULL)
586*7c568831SAndroid Build Coastguard Worker return 1;
587*7c568831SAndroid Build Coastguard Worker
588*7c568831SAndroid Build Coastguard Worker if (parent == child)
589*7c568831SAndroid Build Coastguard Worker return 0;
590*7c568831SAndroid Build Coastguard Worker
591*7c568831SAndroid Build Coastguard Worker if (((1 << child->type) & childMasks[parent->type]) == 0)
592*7c568831SAndroid Build Coastguard Worker return 0;
593*7c568831SAndroid Build Coastguard Worker
594*7c568831SAndroid Build Coastguard Worker if (child->children == NULL)
595*7c568831SAndroid Build Coastguard Worker return 1;
596*7c568831SAndroid Build Coastguard Worker
597*7c568831SAndroid Build Coastguard Worker for (cur = parent->parent; cur != NULL; cur = cur->parent)
598*7c568831SAndroid Build Coastguard Worker if (cur == child)
599*7c568831SAndroid Build Coastguard Worker return 0;
600*7c568831SAndroid Build Coastguard Worker
601*7c568831SAndroid Build Coastguard Worker return 1;
602*7c568831SAndroid Build Coastguard Worker }
603*7c568831SAndroid Build Coastguard Worker
604*7c568831SAndroid Build Coastguard Worker static int
isTextContentNode(xmlNodePtr child)605*7c568831SAndroid Build Coastguard Worker isTextContentNode(xmlNodePtr child) {
606*7c568831SAndroid Build Coastguard Worker if (child == NULL)
607*7c568831SAndroid Build Coastguard Worker return 0;
608*7c568831SAndroid Build Coastguard Worker
609*7c568831SAndroid Build Coastguard Worker return ((1 << child->type) & NODE_MASK_TEXT_CONTENT) != 0;
610*7c568831SAndroid Build Coastguard Worker }
611*7c568831SAndroid Build Coastguard Worker
612*7c568831SAndroid Build Coastguard Worker static int
isDtdChild(xmlNodePtr child)613*7c568831SAndroid Build Coastguard Worker isDtdChild(xmlNodePtr child) {
614*7c568831SAndroid Build Coastguard Worker if (child == NULL)
615*7c568831SAndroid Build Coastguard Worker return 0;
616*7c568831SAndroid Build Coastguard Worker
617*7c568831SAndroid Build Coastguard Worker return ((1 << child->type) & CHILD_MASK_DTD) != 0;
618*7c568831SAndroid Build Coastguard Worker }
619*7c568831SAndroid Build Coastguard Worker
620*7c568831SAndroid Build Coastguard Worker static xmlNodePtr
nodeGetTree(xmlNodePtr node)621*7c568831SAndroid Build Coastguard Worker nodeGetTree(xmlNodePtr node) {
622*7c568831SAndroid Build Coastguard Worker xmlNodePtr cur = node;
623*7c568831SAndroid Build Coastguard Worker
624*7c568831SAndroid Build Coastguard Worker while (cur->parent)
625*7c568831SAndroid Build Coastguard Worker cur = cur->parent;
626*7c568831SAndroid Build Coastguard Worker return cur;
627*7c568831SAndroid Build Coastguard Worker }
628*7c568831SAndroid Build Coastguard Worker
629*7c568831SAndroid Build Coastguard Worker /*
630*7c568831SAndroid Build Coastguard Worker * This function is called whenever a reference to a node is removed.
631*7c568831SAndroid Build Coastguard Worker * It checks whether the node is still reachable and frees unreferenced
632*7c568831SAndroid Build Coastguard Worker * nodes.
633*7c568831SAndroid Build Coastguard Worker *
634*7c568831SAndroid Build Coastguard Worker * A node is reachable if its tree, identified by the root node,
635*7c568831SAndroid Build Coastguard Worker * is reachable. If a non-document tree is unreachable, it can be
636*7c568831SAndroid Build Coastguard Worker * freed.
637*7c568831SAndroid Build Coastguard Worker *
638*7c568831SAndroid Build Coastguard Worker * Multiple trees can share the same document, so a document tree
639*7c568831SAndroid Build Coastguard Worker * can only be freed if no other trees reference the document.
640*7c568831SAndroid Build Coastguard Worker */
641*7c568831SAndroid Build Coastguard Worker static void
dropNode(xmlNodePtr node)642*7c568831SAndroid Build Coastguard Worker dropNode(xmlNodePtr node) {
643*7c568831SAndroid Build Coastguard Worker xmlNodePtr *nodes = vars->nodes;
644*7c568831SAndroid Build Coastguard Worker xmlNodePtr tree;
645*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
646*7c568831SAndroid Build Coastguard Worker int docReferenced = 0;
647*7c568831SAndroid Build Coastguard Worker int i;
648*7c568831SAndroid Build Coastguard Worker
649*7c568831SAndroid Build Coastguard Worker if (node == NULL)
650*7c568831SAndroid Build Coastguard Worker return;
651*7c568831SAndroid Build Coastguard Worker
652*7c568831SAndroid Build Coastguard Worker tree = nodeGetTree(node);
653*7c568831SAndroid Build Coastguard Worker doc = node->doc;
654*7c568831SAndroid Build Coastguard Worker
655*7c568831SAndroid Build Coastguard Worker for (i = 0; i < REG_MAX; i++) {
656*7c568831SAndroid Build Coastguard Worker xmlNodePtr other;
657*7c568831SAndroid Build Coastguard Worker
658*7c568831SAndroid Build Coastguard Worker other = nodes[i];
659*7c568831SAndroid Build Coastguard Worker if (other == NULL)
660*7c568831SAndroid Build Coastguard Worker continue;
661*7c568831SAndroid Build Coastguard Worker
662*7c568831SAndroid Build Coastguard Worker /*
663*7c568831SAndroid Build Coastguard Worker * Return if tree is referenced from another node
664*7c568831SAndroid Build Coastguard Worker */
665*7c568831SAndroid Build Coastguard Worker if (nodeGetTree(other) == tree)
666*7c568831SAndroid Build Coastguard Worker return;
667*7c568831SAndroid Build Coastguard Worker if (doc != NULL && other->doc == doc)
668*7c568831SAndroid Build Coastguard Worker docReferenced = 1;
669*7c568831SAndroid Build Coastguard Worker }
670*7c568831SAndroid Build Coastguard Worker
671*7c568831SAndroid Build Coastguard Worker if (tree != (xmlNodePtr) doc && !isDtdChild(tree)) {
672*7c568831SAndroid Build Coastguard Worker if (doc == NULL || tree->type != XML_DTD_NODE ||
673*7c568831SAndroid Build Coastguard Worker ((xmlDtdPtr) tree != doc->intSubset &&
674*7c568831SAndroid Build Coastguard Worker (xmlDtdPtr) tree != doc->extSubset))
675*7c568831SAndroid Build Coastguard Worker xmlFreeNode(tree);
676*7c568831SAndroid Build Coastguard Worker }
677*7c568831SAndroid Build Coastguard Worker
678*7c568831SAndroid Build Coastguard Worker /*
679*7c568831SAndroid Build Coastguard Worker * Also free document if it isn't referenced from other nodes
680*7c568831SAndroid Build Coastguard Worker */
681*7c568831SAndroid Build Coastguard Worker if (doc != NULL && !docReferenced)
682*7c568831SAndroid Build Coastguard Worker xmlFreeDoc(doc);
683*7c568831SAndroid Build Coastguard Worker }
684*7c568831SAndroid Build Coastguard Worker
685*7c568831SAndroid Build Coastguard Worker /*
686*7c568831SAndroid Build Coastguard Worker * removeNode and removeChildren remove all references to a node
687*7c568831SAndroid Build Coastguard Worker * or its children from the registers. These functions should be
688*7c568831SAndroid Build Coastguard Worker * called if an API function destroys nodes, for example by merging
689*7c568831SAndroid Build Coastguard Worker * text nodes.
690*7c568831SAndroid Build Coastguard Worker */
691*7c568831SAndroid Build Coastguard Worker
692*7c568831SAndroid Build Coastguard Worker static void
removeNode(xmlNodePtr node)693*7c568831SAndroid Build Coastguard Worker removeNode(xmlNodePtr node) {
694*7c568831SAndroid Build Coastguard Worker int i;
695*7c568831SAndroid Build Coastguard Worker
696*7c568831SAndroid Build Coastguard Worker for (i = 0; i < REG_MAX; i++)
697*7c568831SAndroid Build Coastguard Worker if (vars->nodes[i] == node)
698*7c568831SAndroid Build Coastguard Worker vars->nodes[i] = NULL;
699*7c568831SAndroid Build Coastguard Worker }
700*7c568831SAndroid Build Coastguard Worker
701*7c568831SAndroid Build Coastguard Worker static void
removeChildren(xmlNodePtr parent,int self)702*7c568831SAndroid Build Coastguard Worker removeChildren(xmlNodePtr parent, int self) {
703*7c568831SAndroid Build Coastguard Worker int i;
704*7c568831SAndroid Build Coastguard Worker
705*7c568831SAndroid Build Coastguard Worker if (parent == NULL || (!self && parent->children == NULL))
706*7c568831SAndroid Build Coastguard Worker return;
707*7c568831SAndroid Build Coastguard Worker
708*7c568831SAndroid Build Coastguard Worker for (i = 0; i < REG_MAX; i++) {
709*7c568831SAndroid Build Coastguard Worker xmlNodePtr node = vars->nodes[i];
710*7c568831SAndroid Build Coastguard Worker
711*7c568831SAndroid Build Coastguard Worker if (node == parent) {
712*7c568831SAndroid Build Coastguard Worker if (self)
713*7c568831SAndroid Build Coastguard Worker vars->nodes[i] = NULL;
714*7c568831SAndroid Build Coastguard Worker continue;
715*7c568831SAndroid Build Coastguard Worker }
716*7c568831SAndroid Build Coastguard Worker
717*7c568831SAndroid Build Coastguard Worker while (node != NULL) {
718*7c568831SAndroid Build Coastguard Worker node = node->parent;
719*7c568831SAndroid Build Coastguard Worker if (node == parent) {
720*7c568831SAndroid Build Coastguard Worker vars->nodes[i] = NULL;
721*7c568831SAndroid Build Coastguard Worker break;
722*7c568831SAndroid Build Coastguard Worker }
723*7c568831SAndroid Build Coastguard Worker }
724*7c568831SAndroid Build Coastguard Worker }
725*7c568831SAndroid Build Coastguard Worker }
726*7c568831SAndroid Build Coastguard Worker
727*7c568831SAndroid Build Coastguard Worker static xmlNsPtr
nodeGetNs(xmlNodePtr node,int k)728*7c568831SAndroid Build Coastguard Worker nodeGetNs(xmlNodePtr node, int k) {
729*7c568831SAndroid Build Coastguard Worker int i = 0;
730*7c568831SAndroid Build Coastguard Worker xmlNsPtr ns, next;
731*7c568831SAndroid Build Coastguard Worker
732*7c568831SAndroid Build Coastguard Worker if (node == NULL || node->type != XML_ELEMENT_NODE)
733*7c568831SAndroid Build Coastguard Worker return NULL;
734*7c568831SAndroid Build Coastguard Worker
735*7c568831SAndroid Build Coastguard Worker ns = NULL;
736*7c568831SAndroid Build Coastguard Worker next = node->nsDef;
737*7c568831SAndroid Build Coastguard Worker while (1) {
738*7c568831SAndroid Build Coastguard Worker while (next == NULL) {
739*7c568831SAndroid Build Coastguard Worker node = node->parent;
740*7c568831SAndroid Build Coastguard Worker if (node == NULL || node->type != XML_ELEMENT_NODE)
741*7c568831SAndroid Build Coastguard Worker break;
742*7c568831SAndroid Build Coastguard Worker next = node->nsDef;
743*7c568831SAndroid Build Coastguard Worker }
744*7c568831SAndroid Build Coastguard Worker
745*7c568831SAndroid Build Coastguard Worker if (next == NULL)
746*7c568831SAndroid Build Coastguard Worker break;
747*7c568831SAndroid Build Coastguard Worker
748*7c568831SAndroid Build Coastguard Worker ns = next;
749*7c568831SAndroid Build Coastguard Worker if (i == k)
750*7c568831SAndroid Build Coastguard Worker break;
751*7c568831SAndroid Build Coastguard Worker
752*7c568831SAndroid Build Coastguard Worker next = ns->next;
753*7c568831SAndroid Build Coastguard Worker i += 1;
754*7c568831SAndroid Build Coastguard Worker }
755*7c568831SAndroid Build Coastguard Worker
756*7c568831SAndroid Build Coastguard Worker return ns;
757*7c568831SAndroid Build Coastguard Worker }
758*7c568831SAndroid Build Coastguard Worker
759*7c568831SAndroid Build Coastguard Worker /*
760*7c568831SAndroid Build Coastguard Worker * It's easy for programs to exhibit exponential growth patterns.
761*7c568831SAndroid Build Coastguard Worker * For example, a tree being copied and added to the original source
762*7c568831SAndroid Build Coastguard Worker * node doubles memory usage with two operations. Repeating these
763*7c568831SAndroid Build Coastguard Worker * operations leads to 2^n nodes. Similar issues can arise when
764*7c568831SAndroid Build Coastguard Worker * concatenating strings.
765*7c568831SAndroid Build Coastguard Worker *
766*7c568831SAndroid Build Coastguard Worker * We simply ignore tree copies or truncate text if they grow too
767*7c568831SAndroid Build Coastguard Worker * large.
768*7c568831SAndroid Build Coastguard Worker */
769*7c568831SAndroid Build Coastguard Worker
770*7c568831SAndroid Build Coastguard Worker static void
checkContent(xmlNodePtr node)771*7c568831SAndroid Build Coastguard Worker checkContent(xmlNodePtr node) {
772*7c568831SAndroid Build Coastguard Worker if (node != NULL &&
773*7c568831SAndroid Build Coastguard Worker (node->type == XML_TEXT_NODE ||
774*7c568831SAndroid Build Coastguard Worker node->type == XML_CDATA_SECTION_NODE ||
775*7c568831SAndroid Build Coastguard Worker node->type == XML_ENTITY_NODE ||
776*7c568831SAndroid Build Coastguard Worker node->type == XML_PI_NODE ||
777*7c568831SAndroid Build Coastguard Worker node->type == XML_COMMENT_NODE ||
778*7c568831SAndroid Build Coastguard Worker node->type == XML_NOTATION_NODE) &&
779*7c568831SAndroid Build Coastguard Worker xmlStrlen(node->content) > MAX_CONTENT) {
780*7c568831SAndroid Build Coastguard Worker xmlNodeSetContent(node, NULL);
781*7c568831SAndroid Build Coastguard Worker node->content = uncheckedStrdup(BAD_CAST "");
782*7c568831SAndroid Build Coastguard Worker }
783*7c568831SAndroid Build Coastguard Worker }
784*7c568831SAndroid Build Coastguard Worker
785*7c568831SAndroid Build Coastguard Worker static int
countNodes(xmlNodePtr node)786*7c568831SAndroid Build Coastguard Worker countNodes(xmlNodePtr node) {
787*7c568831SAndroid Build Coastguard Worker xmlNodePtr cur;
788*7c568831SAndroid Build Coastguard Worker int numNodes;
789*7c568831SAndroid Build Coastguard Worker
790*7c568831SAndroid Build Coastguard Worker if (node == NULL)
791*7c568831SAndroid Build Coastguard Worker return 0;
792*7c568831SAndroid Build Coastguard Worker
793*7c568831SAndroid Build Coastguard Worker cur = node;
794*7c568831SAndroid Build Coastguard Worker numNodes = 0;
795*7c568831SAndroid Build Coastguard Worker
796*7c568831SAndroid Build Coastguard Worker while (1) {
797*7c568831SAndroid Build Coastguard Worker numNodes += 1;
798*7c568831SAndroid Build Coastguard Worker
799*7c568831SAndroid Build Coastguard Worker if (cur->children != NULL &&
800*7c568831SAndroid Build Coastguard Worker cur->type != XML_ENTITY_REF_NODE) {
801*7c568831SAndroid Build Coastguard Worker cur = cur->children;
802*7c568831SAndroid Build Coastguard Worker } else {
803*7c568831SAndroid Build Coastguard Worker while (cur->next == NULL) {
804*7c568831SAndroid Build Coastguard Worker if (cur == node)
805*7c568831SAndroid Build Coastguard Worker goto done;
806*7c568831SAndroid Build Coastguard Worker cur = cur->parent;
807*7c568831SAndroid Build Coastguard Worker }
808*7c568831SAndroid Build Coastguard Worker cur = cur->next;
809*7c568831SAndroid Build Coastguard Worker }
810*7c568831SAndroid Build Coastguard Worker }
811*7c568831SAndroid Build Coastguard Worker
812*7c568831SAndroid Build Coastguard Worker done:
813*7c568831SAndroid Build Coastguard Worker return numNodes;
814*7c568831SAndroid Build Coastguard Worker }
815*7c568831SAndroid Build Coastguard Worker
816*7c568831SAndroid Build Coastguard Worker static xmlNodePtr
checkCopy(xmlNodePtr copy)817*7c568831SAndroid Build Coastguard Worker checkCopy(xmlNodePtr copy) {
818*7c568831SAndroid Build Coastguard Worker vars->numCopyOps += 1;
819*7c568831SAndroid Build Coastguard Worker
820*7c568831SAndroid Build Coastguard Worker if (copy != NULL &&
821*7c568831SAndroid Build Coastguard Worker (vars->numCopyOps > MAX_COPY_OPS ||
822*7c568831SAndroid Build Coastguard Worker countNodes(copy) > MAX_COPY_NODES)) {
823*7c568831SAndroid Build Coastguard Worker if (copy->type == XML_DOCUMENT_NODE ||
824*7c568831SAndroid Build Coastguard Worker copy->type == XML_HTML_DOCUMENT_NODE)
825*7c568831SAndroid Build Coastguard Worker xmlFreeDoc((xmlDocPtr) copy);
826*7c568831SAndroid Build Coastguard Worker else
827*7c568831SAndroid Build Coastguard Worker xmlFreeNode(copy);
828*7c568831SAndroid Build Coastguard Worker copy = NULL;
829*7c568831SAndroid Build Coastguard Worker }
830*7c568831SAndroid Build Coastguard Worker
831*7c568831SAndroid Build Coastguard Worker return copy;
832*7c568831SAndroid Build Coastguard Worker }
833*7c568831SAndroid Build Coastguard Worker
834*7c568831SAndroid Build Coastguard Worker /*
835*7c568831SAndroid Build Coastguard Worker * Fix namespaces, for example after unlinking a node. This makes
836*7c568831SAndroid Build Coastguard Worker * sure that the node only references namespaces declared in ancestor
837*7c568831SAndroid Build Coastguard Worker * nodes.
838*7c568831SAndroid Build Coastguard Worker */
839*7c568831SAndroid Build Coastguard Worker static int
fixNs(xmlNodePtr node)840*7c568831SAndroid Build Coastguard Worker fixNs(xmlNodePtr node) {
841*7c568831SAndroid Build Coastguard Worker if (node == NULL)
842*7c568831SAndroid Build Coastguard Worker return 0;
843*7c568831SAndroid Build Coastguard Worker
844*7c568831SAndroid Build Coastguard Worker if (node->type == XML_ELEMENT_NODE) {
845*7c568831SAndroid Build Coastguard Worker return xmlReconciliateNs(node->doc, node);
846*7c568831SAndroid Build Coastguard Worker } else if (node->type == XML_ATTRIBUTE_NODE) {
847*7c568831SAndroid Build Coastguard Worker xmlNodePtr parent = node->parent;
848*7c568831SAndroid Build Coastguard Worker
849*7c568831SAndroid Build Coastguard Worker if (parent != NULL)
850*7c568831SAndroid Build Coastguard Worker return xmlReconciliateNs(parent->doc, parent);
851*7c568831SAndroid Build Coastguard Worker else
852*7c568831SAndroid Build Coastguard Worker node->ns = NULL;
853*7c568831SAndroid Build Coastguard Worker }
854*7c568831SAndroid Build Coastguard Worker
855*7c568831SAndroid Build Coastguard Worker return 0;
856*7c568831SAndroid Build Coastguard Worker }
857*7c568831SAndroid Build Coastguard Worker
858*7c568831SAndroid Build Coastguard Worker /* Node operations */
859*7c568831SAndroid Build Coastguard Worker
860*7c568831SAndroid Build Coastguard Worker static void
opNodeAccessor(int op)861*7c568831SAndroid Build Coastguard Worker opNodeAccessor(int op) {
862*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
863*7c568831SAndroid Build Coastguard Worker
864*7c568831SAndroid Build Coastguard Worker switch (op) {
865*7c568831SAndroid Build Coastguard Worker case OP_NODE_PARENT:
866*7c568831SAndroid Build Coastguard Worker startOp("parent"); break;
867*7c568831SAndroid Build Coastguard Worker case OP_NODE_NEXT_SIBLING:
868*7c568831SAndroid Build Coastguard Worker startOp("next"); break;
869*7c568831SAndroid Build Coastguard Worker case OP_NODE_PREV_SIBLING:
870*7c568831SAndroid Build Coastguard Worker startOp("prev"); break;
871*7c568831SAndroid Build Coastguard Worker case OP_NODE_FIRST_CHILD:
872*7c568831SAndroid Build Coastguard Worker startOp("children"); break;
873*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_LAST_CHILD:
874*7c568831SAndroid Build Coastguard Worker startOp("xmlGetLastChild"); break;
875*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_INT_SUBSET:
876*7c568831SAndroid Build Coastguard Worker startOp("xmlGetIntSubset"); break;
877*7c568831SAndroid Build Coastguard Worker case OP_XML_DOC_GET_ROOT_ELEMENT:
878*7c568831SAndroid Build Coastguard Worker startOp("xmlDocGetRootElement"); break;
879*7c568831SAndroid Build Coastguard Worker default:
880*7c568831SAndroid Build Coastguard Worker break;
881*7c568831SAndroid Build Coastguard Worker }
882*7c568831SAndroid Build Coastguard Worker
883*7c568831SAndroid Build Coastguard Worker incNodeIdx();
884*7c568831SAndroid Build Coastguard Worker node = getNode(1);
885*7c568831SAndroid Build Coastguard Worker
886*7c568831SAndroid Build Coastguard Worker if (node != NULL) {
887*7c568831SAndroid Build Coastguard Worker switch (op) {
888*7c568831SAndroid Build Coastguard Worker case OP_NODE_PARENT:
889*7c568831SAndroid Build Coastguard Worker node = node->parent; break;
890*7c568831SAndroid Build Coastguard Worker case OP_NODE_NEXT_SIBLING:
891*7c568831SAndroid Build Coastguard Worker node = node->next; break;
892*7c568831SAndroid Build Coastguard Worker case OP_NODE_PREV_SIBLING:
893*7c568831SAndroid Build Coastguard Worker node = node->prev; break;
894*7c568831SAndroid Build Coastguard Worker case OP_NODE_FIRST_CHILD:
895*7c568831SAndroid Build Coastguard Worker node = node->children; break;
896*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_LAST_CHILD:
897*7c568831SAndroid Build Coastguard Worker node = xmlGetLastChild(node); break;
898*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_INT_SUBSET:
899*7c568831SAndroid Build Coastguard Worker node = (xmlNodePtr) xmlGetIntSubset(node->doc); break;
900*7c568831SAndroid Build Coastguard Worker case OP_XML_DOC_GET_ROOT_ELEMENT:
901*7c568831SAndroid Build Coastguard Worker node = xmlDocGetRootElement(node->doc); break;
902*7c568831SAndroid Build Coastguard Worker default:
903*7c568831SAndroid Build Coastguard Worker break;
904*7c568831SAndroid Build Coastguard Worker }
905*7c568831SAndroid Build Coastguard Worker
906*7c568831SAndroid Build Coastguard Worker /*
907*7c568831SAndroid Build Coastguard Worker * Don't descend into predefined entities
908*7c568831SAndroid Build Coastguard Worker */
909*7c568831SAndroid Build Coastguard Worker if (node != NULL && node->type == XML_ENTITY_DECL) {
910*7c568831SAndroid Build Coastguard Worker xmlEntityPtr ent = (xmlEntityPtr) node;
911*7c568831SAndroid Build Coastguard Worker
912*7c568831SAndroid Build Coastguard Worker if (ent->etype == XML_INTERNAL_PREDEFINED_ENTITY)
913*7c568831SAndroid Build Coastguard Worker node = NULL;
914*7c568831SAndroid Build Coastguard Worker }
915*7c568831SAndroid Build Coastguard Worker }
916*7c568831SAndroid Build Coastguard Worker
917*7c568831SAndroid Build Coastguard Worker setNode(0, node);
918*7c568831SAndroid Build Coastguard Worker }
919*7c568831SAndroid Build Coastguard Worker
920*7c568831SAndroid Build Coastguard Worker static void
opDup(int op)921*7c568831SAndroid Build Coastguard Worker opDup(int op) {
922*7c568831SAndroid Build Coastguard Worker int offset;
923*7c568831SAndroid Build Coastguard Worker
924*7c568831SAndroid Build Coastguard Worker switch (op) {
925*7c568831SAndroid Build Coastguard Worker case OP_DUP_INTEGER:
926*7c568831SAndroid Build Coastguard Worker incIntIdx(); break;
927*7c568831SAndroid Build Coastguard Worker case OP_DUP_STRING:
928*7c568831SAndroid Build Coastguard Worker incStrIdx(); break;
929*7c568831SAndroid Build Coastguard Worker case OP_DUP_NODE:
930*7c568831SAndroid Build Coastguard Worker incNodeIdx(); break;
931*7c568831SAndroid Build Coastguard Worker default:
932*7c568831SAndroid Build Coastguard Worker break;
933*7c568831SAndroid Build Coastguard Worker }
934*7c568831SAndroid Build Coastguard Worker
935*7c568831SAndroid Build Coastguard Worker offset = (xmlFuzzReadInt(1) + 1) & REG_MASK;
936*7c568831SAndroid Build Coastguard Worker
937*7c568831SAndroid Build Coastguard Worker if (offset != 0) {
938*7c568831SAndroid Build Coastguard Worker startOp("dup");
939*7c568831SAndroid Build Coastguard Worker switch (op) {
940*7c568831SAndroid Build Coastguard Worker case OP_DUP_INTEGER:
941*7c568831SAndroid Build Coastguard Worker setInt(0, getInt(offset));
942*7c568831SAndroid Build Coastguard Worker endOp();
943*7c568831SAndroid Build Coastguard Worker break;
944*7c568831SAndroid Build Coastguard Worker case OP_DUP_STRING:
945*7c568831SAndroid Build Coastguard Worker copyStr(0, getStr(offset));
946*7c568831SAndroid Build Coastguard Worker endOp();
947*7c568831SAndroid Build Coastguard Worker break;
948*7c568831SAndroid Build Coastguard Worker case OP_DUP_NODE:
949*7c568831SAndroid Build Coastguard Worker setNode(0, getNode(offset));
950*7c568831SAndroid Build Coastguard Worker break;
951*7c568831SAndroid Build Coastguard Worker default:
952*7c568831SAndroid Build Coastguard Worker break;
953*7c568831SAndroid Build Coastguard Worker }
954*7c568831SAndroid Build Coastguard Worker }
955*7c568831SAndroid Build Coastguard Worker }
956*7c568831SAndroid Build Coastguard Worker
957*7c568831SAndroid Build Coastguard Worker int
LLVMFuzzerInitialize(int * argc ATTRIBUTE_UNUSED,char *** argv ATTRIBUTE_UNUSED)958*7c568831SAndroid Build Coastguard Worker LLVMFuzzerInitialize(int *argc ATTRIBUTE_UNUSED,
959*7c568831SAndroid Build Coastguard Worker char ***argv ATTRIBUTE_UNUSED) {
960*7c568831SAndroid Build Coastguard Worker xmlFuzzMemSetup();
961*7c568831SAndroid Build Coastguard Worker xmlInitParser();
962*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_CATALOG_ENABLED
963*7c568831SAndroid Build Coastguard Worker xmlInitializeCatalog();
964*7c568831SAndroid Build Coastguard Worker xmlCatalogSetDefaults(XML_CATA_ALLOW_NONE);
965*7c568831SAndroid Build Coastguard Worker #endif
966*7c568831SAndroid Build Coastguard Worker xmlSetGenericErrorFunc(NULL, xmlFuzzErrorFunc);
967*7c568831SAndroid Build Coastguard Worker
968*7c568831SAndroid Build Coastguard Worker return 0;
969*7c568831SAndroid Build Coastguard Worker }
970*7c568831SAndroid Build Coastguard Worker
971*7c568831SAndroid Build Coastguard Worker int
LLVMFuzzerTestOneInput(const char * data,size_t size)972*7c568831SAndroid Build Coastguard Worker LLVMFuzzerTestOneInput(const char *data, size_t size) {
973*7c568831SAndroid Build Coastguard Worker size_t maxAlloc;
974*7c568831SAndroid Build Coastguard Worker int i;
975*7c568831SAndroid Build Coastguard Worker
976*7c568831SAndroid Build Coastguard Worker if (size > 1000)
977*7c568831SAndroid Build Coastguard Worker return 0;
978*7c568831SAndroid Build Coastguard Worker
979*7c568831SAndroid Build Coastguard Worker memset(vars, 0, sizeof(*vars));
980*7c568831SAndroid Build Coastguard Worker
981*7c568831SAndroid Build Coastguard Worker xmlFuzzDataInit(data, size);
982*7c568831SAndroid Build Coastguard Worker
983*7c568831SAndroid Build Coastguard Worker maxAlloc = xmlFuzzReadInt(4) % (size * 50 + 10);
984*7c568831SAndroid Build Coastguard Worker xmlFuzzMemSetLimit(maxAlloc);
985*7c568831SAndroid Build Coastguard Worker
986*7c568831SAndroid Build Coastguard Worker /*
987*7c568831SAndroid Build Coastguard Worker * Interpreter loop
988*7c568831SAndroid Build Coastguard Worker *
989*7c568831SAndroid Build Coastguard Worker * Processing an opcode typically involves
990*7c568831SAndroid Build Coastguard Worker *
991*7c568831SAndroid Build Coastguard Worker * - startOp for debugging
992*7c568831SAndroid Build Coastguard Worker * - increase output register index if non-void
993*7c568831SAndroid Build Coastguard Worker * - get arguments from input registers
994*7c568831SAndroid Build Coastguard Worker * - invoke API function
995*7c568831SAndroid Build Coastguard Worker * - set oomReport
996*7c568831SAndroid Build Coastguard Worker * - set output register
997*7c568831SAndroid Build Coastguard Worker * - memory management and other adjustments
998*7c568831SAndroid Build Coastguard Worker * - endOp for void functions
999*7c568831SAndroid Build Coastguard Worker */
1000*7c568831SAndroid Build Coastguard Worker
1001*7c568831SAndroid Build Coastguard Worker while (xmlFuzzBytesRemaining()) {
1002*7c568831SAndroid Build Coastguard Worker size_t readSize;
1003*7c568831SAndroid Build Coastguard Worker int op = xmlFuzzReadInt(1);
1004*7c568831SAndroid Build Coastguard Worker int oomReport = -1; /* -1 means unknown */
1005*7c568831SAndroid Build Coastguard Worker
1006*7c568831SAndroid Build Coastguard Worker vars->opName = "[unset]";
1007*7c568831SAndroid Build Coastguard Worker
1008*7c568831SAndroid Build Coastguard Worker switch (op) {
1009*7c568831SAndroid Build Coastguard Worker case OP_CREATE_INTEGER:
1010*7c568831SAndroid Build Coastguard Worker incIntIdx();
1011*7c568831SAndroid Build Coastguard Worker setInt(0, (int) xmlFuzzReadInt(4));
1012*7c568831SAndroid Build Coastguard Worker break;
1013*7c568831SAndroid Build Coastguard Worker
1014*7c568831SAndroid Build Coastguard Worker case OP_CREATE_STRING:
1015*7c568831SAndroid Build Coastguard Worker incStrIdx();
1016*7c568831SAndroid Build Coastguard Worker copyStr(0, BAD_CAST xmlFuzzReadString(&readSize));
1017*7c568831SAndroid Build Coastguard Worker break;
1018*7c568831SAndroid Build Coastguard Worker
1019*7c568831SAndroid Build Coastguard Worker case OP_DUP_INTEGER:
1020*7c568831SAndroid Build Coastguard Worker case OP_DUP_STRING:
1021*7c568831SAndroid Build Coastguard Worker case OP_DUP_NODE:
1022*7c568831SAndroid Build Coastguard Worker opDup(op);
1023*7c568831SAndroid Build Coastguard Worker break;
1024*7c568831SAndroid Build Coastguard Worker
1025*7c568831SAndroid Build Coastguard Worker case OP_PARSE_DOCUMENT:
1026*7c568831SAndroid Build Coastguard Worker /*
1027*7c568831SAndroid Build Coastguard Worker * We don't really want to test the parser but exposing
1028*7c568831SAndroid Build Coastguard Worker * xmlReadDoc seems like a useful way generate or
1029*7c568831SAndroid Build Coastguard Worker * round-trip documents.
1030*7c568831SAndroid Build Coastguard Worker *
1031*7c568831SAndroid Build Coastguard Worker * This also creates documents with a dictionary which
1032*7c568831SAndroid Build Coastguard Worker * is crucial to hit some code paths.
1033*7c568831SAndroid Build Coastguard Worker */
1034*7c568831SAndroid Build Coastguard Worker startOp("xmlReadDoc");
1035*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1036*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) xmlReadDoc(
1037*7c568831SAndroid Build Coastguard Worker getStr(0),
1038*7c568831SAndroid Build Coastguard Worker getCStr(1),
1039*7c568831SAndroid Build Coastguard Worker getCStr(2),
1040*7c568831SAndroid Build Coastguard Worker getInt(0)));
1041*7c568831SAndroid Build Coastguard Worker break;
1042*7c568831SAndroid Build Coastguard Worker
1043*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_DOC: {
1044*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
1045*7c568831SAndroid Build Coastguard Worker
1046*7c568831SAndroid Build Coastguard Worker /*
1047*7c568831SAndroid Build Coastguard Worker * TODO: There's no public API function to generate a
1048*7c568831SAndroid Build Coastguard Worker * document with a dictionary. We should add an extra
1049*7c568831SAndroid Build Coastguard Worker * opcode that sets doc->dict.
1050*7c568831SAndroid Build Coastguard Worker */
1051*7c568831SAndroid Build Coastguard Worker startOp("xmlNewDoc");
1052*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1053*7c568831SAndroid Build Coastguard Worker doc = xmlNewDoc(getStr(0));
1054*7c568831SAndroid Build Coastguard Worker oomReport = (doc == NULL);
1055*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) doc);
1056*7c568831SAndroid Build Coastguard Worker break;
1057*7c568831SAndroid Build Coastguard Worker }
1058*7c568831SAndroid Build Coastguard Worker
1059*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_NODE: {
1060*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1061*7c568831SAndroid Build Coastguard Worker const xmlChar *name;
1062*7c568831SAndroid Build Coastguard Worker
1063*7c568831SAndroid Build Coastguard Worker startOp("xmlNewNode");
1064*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1065*7c568831SAndroid Build Coastguard Worker node = xmlNewNode(
1066*7c568831SAndroid Build Coastguard Worker nodeGetNs(getNode(1), getInt(0)),
1067*7c568831SAndroid Build Coastguard Worker name = getStr(0));
1068*7c568831SAndroid Build Coastguard Worker oomReport = (name != NULL && node == NULL);
1069*7c568831SAndroid Build Coastguard Worker if (fixNs(node) < 0)
1070*7c568831SAndroid Build Coastguard Worker oomReport = 1;
1071*7c568831SAndroid Build Coastguard Worker setNode(0, node);
1072*7c568831SAndroid Build Coastguard Worker break;
1073*7c568831SAndroid Build Coastguard Worker }
1074*7c568831SAndroid Build Coastguard Worker
1075*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_NODE_EAT_NAME: {
1076*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1077*7c568831SAndroid Build Coastguard Worker xmlChar *name;
1078*7c568831SAndroid Build Coastguard Worker
1079*7c568831SAndroid Build Coastguard Worker startOp("xmlNewNodeEatName");
1080*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1081*7c568831SAndroid Build Coastguard Worker node = xmlNewNodeEatName(
1082*7c568831SAndroid Build Coastguard Worker nodeGetNs(getNode(1), getInt(0)),
1083*7c568831SAndroid Build Coastguard Worker name = uncheckedStrdup(getStr(0)));
1084*7c568831SAndroid Build Coastguard Worker oomReport = (name != NULL && node == NULL);
1085*7c568831SAndroid Build Coastguard Worker if (fixNs(node) < 0)
1086*7c568831SAndroid Build Coastguard Worker oomReport = 1;
1087*7c568831SAndroid Build Coastguard Worker setNode(0, node);
1088*7c568831SAndroid Build Coastguard Worker break;
1089*7c568831SAndroid Build Coastguard Worker }
1090*7c568831SAndroid Build Coastguard Worker
1091*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_DOC_NODE: {
1092*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1093*7c568831SAndroid Build Coastguard Worker const xmlChar *name;
1094*7c568831SAndroid Build Coastguard Worker
1095*7c568831SAndroid Build Coastguard Worker startOp("xmlNewDocNode");
1096*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1097*7c568831SAndroid Build Coastguard Worker node = xmlNewDocNode(
1098*7c568831SAndroid Build Coastguard Worker getDoc(1),
1099*7c568831SAndroid Build Coastguard Worker nodeGetNs(getNode(2), getInt(0)),
1100*7c568831SAndroid Build Coastguard Worker name = getStr(0),
1101*7c568831SAndroid Build Coastguard Worker getStr(1));
1102*7c568831SAndroid Build Coastguard Worker oomReport = (name != NULL && node == NULL);
1103*7c568831SAndroid Build Coastguard Worker if (fixNs(node) < 0)
1104*7c568831SAndroid Build Coastguard Worker oomReport = 1;
1105*7c568831SAndroid Build Coastguard Worker setNode(0, node);
1106*7c568831SAndroid Build Coastguard Worker break;
1107*7c568831SAndroid Build Coastguard Worker }
1108*7c568831SAndroid Build Coastguard Worker
1109*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_DOC_NODE_EAT_NAME: {
1110*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1111*7c568831SAndroid Build Coastguard Worker xmlChar *name;
1112*7c568831SAndroid Build Coastguard Worker
1113*7c568831SAndroid Build Coastguard Worker startOp("xmlNewDocNodeEatName");
1114*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1115*7c568831SAndroid Build Coastguard Worker node = xmlNewDocNodeEatName(
1116*7c568831SAndroid Build Coastguard Worker getDoc(1),
1117*7c568831SAndroid Build Coastguard Worker nodeGetNs(getNode(2), getInt(0)),
1118*7c568831SAndroid Build Coastguard Worker name = uncheckedStrdup(getStr(0)),
1119*7c568831SAndroid Build Coastguard Worker getStr(1));
1120*7c568831SAndroid Build Coastguard Worker oomReport = (name != NULL && node == NULL);
1121*7c568831SAndroid Build Coastguard Worker if (fixNs(node) < 0)
1122*7c568831SAndroid Build Coastguard Worker oomReport = 1;
1123*7c568831SAndroid Build Coastguard Worker setNode(0, node);
1124*7c568831SAndroid Build Coastguard Worker break;
1125*7c568831SAndroid Build Coastguard Worker }
1126*7c568831SAndroid Build Coastguard Worker
1127*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_DOC_RAW_NODE: {
1128*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1129*7c568831SAndroid Build Coastguard Worker const xmlChar *name;
1130*7c568831SAndroid Build Coastguard Worker
1131*7c568831SAndroid Build Coastguard Worker startOp("xmlNewDocRawNode");
1132*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1133*7c568831SAndroid Build Coastguard Worker node = xmlNewDocRawNode(
1134*7c568831SAndroid Build Coastguard Worker getDoc(1),
1135*7c568831SAndroid Build Coastguard Worker nodeGetNs(getNode(2), getInt(0)),
1136*7c568831SAndroid Build Coastguard Worker name = getStr(0),
1137*7c568831SAndroid Build Coastguard Worker getStr(1));
1138*7c568831SAndroid Build Coastguard Worker oomReport = (name != NULL && node == NULL);
1139*7c568831SAndroid Build Coastguard Worker if (fixNs(node) < 0)
1140*7c568831SAndroid Build Coastguard Worker oomReport = 1;
1141*7c568831SAndroid Build Coastguard Worker setNode(0, node);
1142*7c568831SAndroid Build Coastguard Worker break;
1143*7c568831SAndroid Build Coastguard Worker }
1144*7c568831SAndroid Build Coastguard Worker
1145*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_CHILD: {
1146*7c568831SAndroid Build Coastguard Worker xmlNodePtr parent, node;
1147*7c568831SAndroid Build Coastguard Worker const xmlChar *name;
1148*7c568831SAndroid Build Coastguard Worker
1149*7c568831SAndroid Build Coastguard Worker startOp("xmlNewChild");
1150*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1151*7c568831SAndroid Build Coastguard Worker /* Use parent namespace without fixup */
1152*7c568831SAndroid Build Coastguard Worker node = xmlNewChild(
1153*7c568831SAndroid Build Coastguard Worker parent = getNode(1),
1154*7c568831SAndroid Build Coastguard Worker nodeGetNs(getNode(1), getInt(0)),
1155*7c568831SAndroid Build Coastguard Worker name = getStr(0),
1156*7c568831SAndroid Build Coastguard Worker getStr(1));
1157*7c568831SAndroid Build Coastguard Worker oomReport =
1158*7c568831SAndroid Build Coastguard Worker (parent != NULL &&
1159*7c568831SAndroid Build Coastguard Worker isValidChildType(parent, XML_ELEMENT_NODE) &&
1160*7c568831SAndroid Build Coastguard Worker name != NULL &&
1161*7c568831SAndroid Build Coastguard Worker node == NULL);
1162*7c568831SAndroid Build Coastguard Worker setNode(0, node);
1163*7c568831SAndroid Build Coastguard Worker break;
1164*7c568831SAndroid Build Coastguard Worker }
1165*7c568831SAndroid Build Coastguard Worker
1166*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_TEXT_CHILD: {
1167*7c568831SAndroid Build Coastguard Worker xmlNodePtr parent, node;
1168*7c568831SAndroid Build Coastguard Worker const xmlChar *name;
1169*7c568831SAndroid Build Coastguard Worker
1170*7c568831SAndroid Build Coastguard Worker startOp("xmlNewTextChild");
1171*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1172*7c568831SAndroid Build Coastguard Worker /* Use parent namespace without fixup */
1173*7c568831SAndroid Build Coastguard Worker node = xmlNewTextChild(
1174*7c568831SAndroid Build Coastguard Worker parent = getNode(1),
1175*7c568831SAndroid Build Coastguard Worker nodeGetNs(getNode(1), getInt(0)),
1176*7c568831SAndroid Build Coastguard Worker name = getStr(0),
1177*7c568831SAndroid Build Coastguard Worker getStr(1));
1178*7c568831SAndroid Build Coastguard Worker oomReport =
1179*7c568831SAndroid Build Coastguard Worker (parent != NULL &&
1180*7c568831SAndroid Build Coastguard Worker isValidChildType(parent, XML_ELEMENT_NODE) &&
1181*7c568831SAndroid Build Coastguard Worker name != NULL &&
1182*7c568831SAndroid Build Coastguard Worker node == NULL);
1183*7c568831SAndroid Build Coastguard Worker setNode(0, node);
1184*7c568831SAndroid Build Coastguard Worker break;
1185*7c568831SAndroid Build Coastguard Worker }
1186*7c568831SAndroid Build Coastguard Worker
1187*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_PROP: {
1188*7c568831SAndroid Build Coastguard Worker xmlNodePtr parent;
1189*7c568831SAndroid Build Coastguard Worker xmlAttrPtr attr;
1190*7c568831SAndroid Build Coastguard Worker const xmlChar *name;
1191*7c568831SAndroid Build Coastguard Worker
1192*7c568831SAndroid Build Coastguard Worker startOp("xmlNewProp");
1193*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1194*7c568831SAndroid Build Coastguard Worker attr = xmlNewProp(
1195*7c568831SAndroid Build Coastguard Worker parent = getNode(1),
1196*7c568831SAndroid Build Coastguard Worker name = getStr(0),
1197*7c568831SAndroid Build Coastguard Worker getStr(1));
1198*7c568831SAndroid Build Coastguard Worker oomReport =
1199*7c568831SAndroid Build Coastguard Worker ((parent == NULL || parent->type == XML_ELEMENT_NODE) &&
1200*7c568831SAndroid Build Coastguard Worker name != NULL &&
1201*7c568831SAndroid Build Coastguard Worker attr == NULL);
1202*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) attr);
1203*7c568831SAndroid Build Coastguard Worker break;
1204*7c568831SAndroid Build Coastguard Worker }
1205*7c568831SAndroid Build Coastguard Worker
1206*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_DOC_PROP: {
1207*7c568831SAndroid Build Coastguard Worker xmlAttrPtr attr;
1208*7c568831SAndroid Build Coastguard Worker const xmlChar *name;
1209*7c568831SAndroid Build Coastguard Worker
1210*7c568831SAndroid Build Coastguard Worker startOp("xmlNewDocProp");
1211*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1212*7c568831SAndroid Build Coastguard Worker attr = xmlNewDocProp(
1213*7c568831SAndroid Build Coastguard Worker getDoc(1),
1214*7c568831SAndroid Build Coastguard Worker name = getStr(0),
1215*7c568831SAndroid Build Coastguard Worker getStr(1));
1216*7c568831SAndroid Build Coastguard Worker oomReport = (name != NULL && attr == NULL);
1217*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) attr);
1218*7c568831SAndroid Build Coastguard Worker break;
1219*7c568831SAndroid Build Coastguard Worker }
1220*7c568831SAndroid Build Coastguard Worker
1221*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_NS_PROP: {
1222*7c568831SAndroid Build Coastguard Worker xmlAttrPtr attr;
1223*7c568831SAndroid Build Coastguard Worker
1224*7c568831SAndroid Build Coastguard Worker startOp("xmlNewNsProp");
1225*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1226*7c568831SAndroid Build Coastguard Worker attr = xmlNewNsProp(
1227*7c568831SAndroid Build Coastguard Worker getNode(1),
1228*7c568831SAndroid Build Coastguard Worker nodeGetNs(getNode(1), getInt(0)),
1229*7c568831SAndroid Build Coastguard Worker getStr(0),
1230*7c568831SAndroid Build Coastguard Worker getStr(1));
1231*7c568831SAndroid Build Coastguard Worker /* xmlNewNsProp returns NULL on duplicate prefixes. */
1232*7c568831SAndroid Build Coastguard Worker if (attr != NULL)
1233*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1234*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) attr);
1235*7c568831SAndroid Build Coastguard Worker break;
1236*7c568831SAndroid Build Coastguard Worker }
1237*7c568831SAndroid Build Coastguard Worker
1238*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_NS_PROP_EAT_NAME: {
1239*7c568831SAndroid Build Coastguard Worker xmlAttrPtr attr;
1240*7c568831SAndroid Build Coastguard Worker
1241*7c568831SAndroid Build Coastguard Worker startOp("xmlNewNsPropEatName");
1242*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1243*7c568831SAndroid Build Coastguard Worker attr = xmlNewNsPropEatName(
1244*7c568831SAndroid Build Coastguard Worker getNode(1),
1245*7c568831SAndroid Build Coastguard Worker nodeGetNs(getNode(1), getInt(0)),
1246*7c568831SAndroid Build Coastguard Worker uncheckedStrdup(getStr(0)),
1247*7c568831SAndroid Build Coastguard Worker getStr(1));
1248*7c568831SAndroid Build Coastguard Worker if (attr != NULL)
1249*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1250*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) attr);
1251*7c568831SAndroid Build Coastguard Worker break;
1252*7c568831SAndroid Build Coastguard Worker }
1253*7c568831SAndroid Build Coastguard Worker
1254*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_TEXT: {
1255*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1256*7c568831SAndroid Build Coastguard Worker
1257*7c568831SAndroid Build Coastguard Worker startOp("xmlNewText");
1258*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1259*7c568831SAndroid Build Coastguard Worker node = xmlNewText(getStr(0));
1260*7c568831SAndroid Build Coastguard Worker oomReport = (node == NULL);
1261*7c568831SAndroid Build Coastguard Worker setNode(0, node);
1262*7c568831SAndroid Build Coastguard Worker break;
1263*7c568831SAndroid Build Coastguard Worker }
1264*7c568831SAndroid Build Coastguard Worker
1265*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_TEXT_LEN: {
1266*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1267*7c568831SAndroid Build Coastguard Worker const xmlChar *text;
1268*7c568831SAndroid Build Coastguard Worker
1269*7c568831SAndroid Build Coastguard Worker startOp("xmlNewTextLen");
1270*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1271*7c568831SAndroid Build Coastguard Worker text = getStr(0);
1272*7c568831SAndroid Build Coastguard Worker node = xmlNewTextLen(text, xmlStrlen(text));
1273*7c568831SAndroid Build Coastguard Worker oomReport = (node == NULL);
1274*7c568831SAndroid Build Coastguard Worker setNode(0, node);
1275*7c568831SAndroid Build Coastguard Worker break;
1276*7c568831SAndroid Build Coastguard Worker }
1277*7c568831SAndroid Build Coastguard Worker
1278*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_DOC_TEXT: {
1279*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1280*7c568831SAndroid Build Coastguard Worker
1281*7c568831SAndroid Build Coastguard Worker startOp("xmlNewDocText");
1282*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1283*7c568831SAndroid Build Coastguard Worker node = xmlNewDocText(getDoc(1), getStr(0));
1284*7c568831SAndroid Build Coastguard Worker oomReport = (node == NULL);
1285*7c568831SAndroid Build Coastguard Worker setNode(0, node);
1286*7c568831SAndroid Build Coastguard Worker break;
1287*7c568831SAndroid Build Coastguard Worker }
1288*7c568831SAndroid Build Coastguard Worker
1289*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_DOC_TEXT_LEN: {
1290*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
1291*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1292*7c568831SAndroid Build Coastguard Worker const xmlChar *text;
1293*7c568831SAndroid Build Coastguard Worker
1294*7c568831SAndroid Build Coastguard Worker startOp("xmlNewDocTextLen");
1295*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1296*7c568831SAndroid Build Coastguard Worker doc = getDoc(1);
1297*7c568831SAndroid Build Coastguard Worker text = getStr(0);
1298*7c568831SAndroid Build Coastguard Worker node = xmlNewDocTextLen(doc, text, xmlStrlen(text));
1299*7c568831SAndroid Build Coastguard Worker oomReport = (node == NULL);
1300*7c568831SAndroid Build Coastguard Worker setNode(0, node);
1301*7c568831SAndroid Build Coastguard Worker break;
1302*7c568831SAndroid Build Coastguard Worker }
1303*7c568831SAndroid Build Coastguard Worker
1304*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_PI: {
1305*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1306*7c568831SAndroid Build Coastguard Worker const xmlChar *name;
1307*7c568831SAndroid Build Coastguard Worker
1308*7c568831SAndroid Build Coastguard Worker startOp("xmlNewPI");
1309*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1310*7c568831SAndroid Build Coastguard Worker node = xmlNewPI(
1311*7c568831SAndroid Build Coastguard Worker name = getStr(0),
1312*7c568831SAndroid Build Coastguard Worker getStr(1));
1313*7c568831SAndroid Build Coastguard Worker oomReport = (name != NULL && node == NULL);
1314*7c568831SAndroid Build Coastguard Worker setNode(0, node);
1315*7c568831SAndroid Build Coastguard Worker break;
1316*7c568831SAndroid Build Coastguard Worker }
1317*7c568831SAndroid Build Coastguard Worker
1318*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_DOC_PI: {
1319*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1320*7c568831SAndroid Build Coastguard Worker const xmlChar *name;
1321*7c568831SAndroid Build Coastguard Worker
1322*7c568831SAndroid Build Coastguard Worker startOp("xmlNewDocPI");
1323*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1324*7c568831SAndroid Build Coastguard Worker node = xmlNewDocPI(
1325*7c568831SAndroid Build Coastguard Worker getDoc(1),
1326*7c568831SAndroid Build Coastguard Worker name = getStr(0),
1327*7c568831SAndroid Build Coastguard Worker getStr(1));
1328*7c568831SAndroid Build Coastguard Worker oomReport = (name != NULL && node == NULL);
1329*7c568831SAndroid Build Coastguard Worker setNode(0, node);
1330*7c568831SAndroid Build Coastguard Worker break;
1331*7c568831SAndroid Build Coastguard Worker }
1332*7c568831SAndroid Build Coastguard Worker
1333*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_COMMENT: {
1334*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1335*7c568831SAndroid Build Coastguard Worker
1336*7c568831SAndroid Build Coastguard Worker startOp("xmlNewComment");
1337*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1338*7c568831SAndroid Build Coastguard Worker node = xmlNewComment(getStr(0));
1339*7c568831SAndroid Build Coastguard Worker oomReport = (node == NULL);
1340*7c568831SAndroid Build Coastguard Worker setNode(0, node);
1341*7c568831SAndroid Build Coastguard Worker break;
1342*7c568831SAndroid Build Coastguard Worker }
1343*7c568831SAndroid Build Coastguard Worker
1344*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_DOC_COMMENT: {
1345*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1346*7c568831SAndroid Build Coastguard Worker
1347*7c568831SAndroid Build Coastguard Worker startOp("xmlNewDocComment");
1348*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1349*7c568831SAndroid Build Coastguard Worker node = xmlNewDocComment(
1350*7c568831SAndroid Build Coastguard Worker getDoc(1),
1351*7c568831SAndroid Build Coastguard Worker getStr(0));
1352*7c568831SAndroid Build Coastguard Worker oomReport = (node == NULL);
1353*7c568831SAndroid Build Coastguard Worker setNode(0, node);
1354*7c568831SAndroid Build Coastguard Worker break;
1355*7c568831SAndroid Build Coastguard Worker }
1356*7c568831SAndroid Build Coastguard Worker
1357*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_CDATA_BLOCK: {
1358*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
1359*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1360*7c568831SAndroid Build Coastguard Worker const xmlChar *text;
1361*7c568831SAndroid Build Coastguard Worker
1362*7c568831SAndroid Build Coastguard Worker startOp("xmlNewCDataBlock");
1363*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1364*7c568831SAndroid Build Coastguard Worker doc = getDoc(1);
1365*7c568831SAndroid Build Coastguard Worker text = getStr(0);
1366*7c568831SAndroid Build Coastguard Worker node = xmlNewDocTextLen(
1367*7c568831SAndroid Build Coastguard Worker doc,
1368*7c568831SAndroid Build Coastguard Worker text,
1369*7c568831SAndroid Build Coastguard Worker xmlStrlen(text));
1370*7c568831SAndroid Build Coastguard Worker oomReport = (node == NULL);
1371*7c568831SAndroid Build Coastguard Worker setNode(0, node);
1372*7c568831SAndroid Build Coastguard Worker break;
1373*7c568831SAndroid Build Coastguard Worker }
1374*7c568831SAndroid Build Coastguard Worker
1375*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_CHAR_REF: {
1376*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1377*7c568831SAndroid Build Coastguard Worker const xmlChar *name;
1378*7c568831SAndroid Build Coastguard Worker
1379*7c568831SAndroid Build Coastguard Worker startOp("xmlNewCharRef");
1380*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1381*7c568831SAndroid Build Coastguard Worker node = xmlNewCharRef(
1382*7c568831SAndroid Build Coastguard Worker getDoc(1),
1383*7c568831SAndroid Build Coastguard Worker name = getStr(0));
1384*7c568831SAndroid Build Coastguard Worker oomReport = (name != NULL && node == NULL);
1385*7c568831SAndroid Build Coastguard Worker setNode(0, node);
1386*7c568831SAndroid Build Coastguard Worker break;
1387*7c568831SAndroid Build Coastguard Worker }
1388*7c568831SAndroid Build Coastguard Worker
1389*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_REFERENCE: {
1390*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1391*7c568831SAndroid Build Coastguard Worker const xmlChar *name;
1392*7c568831SAndroid Build Coastguard Worker
1393*7c568831SAndroid Build Coastguard Worker startOp("xmlNewReference");
1394*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1395*7c568831SAndroid Build Coastguard Worker node = xmlNewReference(
1396*7c568831SAndroid Build Coastguard Worker getDoc(1),
1397*7c568831SAndroid Build Coastguard Worker name = getStr(0));
1398*7c568831SAndroid Build Coastguard Worker oomReport = (name != NULL && node == NULL);
1399*7c568831SAndroid Build Coastguard Worker setNode(0, node);
1400*7c568831SAndroid Build Coastguard Worker break;
1401*7c568831SAndroid Build Coastguard Worker }
1402*7c568831SAndroid Build Coastguard Worker
1403*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_DOC_FRAGMENT: {
1404*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1405*7c568831SAndroid Build Coastguard Worker
1406*7c568831SAndroid Build Coastguard Worker startOp("xmlNewDocFragment");
1407*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1408*7c568831SAndroid Build Coastguard Worker node = xmlNewDocFragment(getDoc(1));
1409*7c568831SAndroid Build Coastguard Worker oomReport = (node == NULL);
1410*7c568831SAndroid Build Coastguard Worker setNode(0, node);
1411*7c568831SAndroid Build Coastguard Worker break;
1412*7c568831SAndroid Build Coastguard Worker }
1413*7c568831SAndroid Build Coastguard Worker
1414*7c568831SAndroid Build Coastguard Worker case OP_XML_CREATE_INT_SUBSET: {
1415*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
1416*7c568831SAndroid Build Coastguard Worker xmlDtdPtr dtd = NULL;
1417*7c568831SAndroid Build Coastguard Worker
1418*7c568831SAndroid Build Coastguard Worker startOp("xmlCreateIntSubset");
1419*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1420*7c568831SAndroid Build Coastguard Worker doc = getDoc(1);
1421*7c568831SAndroid Build Coastguard Worker if (doc == NULL || doc->intSubset == NULL) {
1422*7c568831SAndroid Build Coastguard Worker dtd = xmlCreateIntSubset(
1423*7c568831SAndroid Build Coastguard Worker doc,
1424*7c568831SAndroid Build Coastguard Worker getStr(0),
1425*7c568831SAndroid Build Coastguard Worker getStr(1),
1426*7c568831SAndroid Build Coastguard Worker getStr(2));
1427*7c568831SAndroid Build Coastguard Worker oomReport = (dtd == NULL);
1428*7c568831SAndroid Build Coastguard Worker }
1429*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) dtd);
1430*7c568831SAndroid Build Coastguard Worker break;
1431*7c568831SAndroid Build Coastguard Worker }
1432*7c568831SAndroid Build Coastguard Worker
1433*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_DTD: {
1434*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
1435*7c568831SAndroid Build Coastguard Worker xmlDtdPtr dtd = NULL;
1436*7c568831SAndroid Build Coastguard Worker
1437*7c568831SAndroid Build Coastguard Worker startOp("xmlNewDtd");
1438*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1439*7c568831SAndroid Build Coastguard Worker doc = getDoc(1);
1440*7c568831SAndroid Build Coastguard Worker if (doc == NULL || doc->extSubset == NULL) {
1441*7c568831SAndroid Build Coastguard Worker dtd = xmlNewDtd(
1442*7c568831SAndroid Build Coastguard Worker doc,
1443*7c568831SAndroid Build Coastguard Worker getStr(0),
1444*7c568831SAndroid Build Coastguard Worker getStr(1),
1445*7c568831SAndroid Build Coastguard Worker getStr(2));
1446*7c568831SAndroid Build Coastguard Worker oomReport = (dtd == NULL);
1447*7c568831SAndroid Build Coastguard Worker }
1448*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) dtd);
1449*7c568831SAndroid Build Coastguard Worker break;
1450*7c568831SAndroid Build Coastguard Worker }
1451*7c568831SAndroid Build Coastguard Worker
1452*7c568831SAndroid Build Coastguard Worker case OP_XML_COPY_DOC: {
1453*7c568831SAndroid Build Coastguard Worker xmlDocPtr copy;
1454*7c568831SAndroid Build Coastguard Worker
1455*7c568831SAndroid Build Coastguard Worker startOp("xmlCopyDoc");
1456*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1457*7c568831SAndroid Build Coastguard Worker copy = xmlCopyDoc(
1458*7c568831SAndroid Build Coastguard Worker getDoc(1),
1459*7c568831SAndroid Build Coastguard Worker getInt(0));
1460*7c568831SAndroid Build Coastguard Worker /*
1461*7c568831SAndroid Build Coastguard Worker * TODO: Copying DTD nodes without a document can
1462*7c568831SAndroid Build Coastguard Worker * result in an empty list.
1463*7c568831SAndroid Build Coastguard Worker */
1464*7c568831SAndroid Build Coastguard Worker if (copy != NULL)
1465*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1466*7c568831SAndroid Build Coastguard Worker setNode(0, checkCopy((xmlNodePtr) copy));
1467*7c568831SAndroid Build Coastguard Worker break;
1468*7c568831SAndroid Build Coastguard Worker }
1469*7c568831SAndroid Build Coastguard Worker
1470*7c568831SAndroid Build Coastguard Worker case OP_XML_COPY_NODE: {
1471*7c568831SAndroid Build Coastguard Worker xmlNodePtr copy;
1472*7c568831SAndroid Build Coastguard Worker
1473*7c568831SAndroid Build Coastguard Worker startOp("xmlCopyNode");
1474*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1475*7c568831SAndroid Build Coastguard Worker copy = xmlCopyNode(
1476*7c568831SAndroid Build Coastguard Worker getNode(1),
1477*7c568831SAndroid Build Coastguard Worker getInt(0));
1478*7c568831SAndroid Build Coastguard Worker if (copy != NULL)
1479*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1480*7c568831SAndroid Build Coastguard Worker setNode(0, checkCopy((xmlNodePtr) copy));
1481*7c568831SAndroid Build Coastguard Worker break;
1482*7c568831SAndroid Build Coastguard Worker }
1483*7c568831SAndroid Build Coastguard Worker
1484*7c568831SAndroid Build Coastguard Worker case OP_XML_COPY_NODE_LIST: {
1485*7c568831SAndroid Build Coastguard Worker xmlNodePtr copy;
1486*7c568831SAndroid Build Coastguard Worker
1487*7c568831SAndroid Build Coastguard Worker startOp("xmlCopyNodeList");
1488*7c568831SAndroid Build Coastguard Worker copy = xmlCopyNodeList(getNode(0));
1489*7c568831SAndroid Build Coastguard Worker if (copy != NULL)
1490*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1491*7c568831SAndroid Build Coastguard Worker xmlFreeNodeList(copy);
1492*7c568831SAndroid Build Coastguard Worker endOp();
1493*7c568831SAndroid Build Coastguard Worker break;
1494*7c568831SAndroid Build Coastguard Worker }
1495*7c568831SAndroid Build Coastguard Worker
1496*7c568831SAndroid Build Coastguard Worker case OP_XML_DOC_COPY_NODE: {
1497*7c568831SAndroid Build Coastguard Worker xmlNodePtr node, copy;
1498*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
1499*7c568831SAndroid Build Coastguard Worker
1500*7c568831SAndroid Build Coastguard Worker startOp("xmlDocCopyNode");
1501*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1502*7c568831SAndroid Build Coastguard Worker copy = xmlDocCopyNode(
1503*7c568831SAndroid Build Coastguard Worker node = getNode(1),
1504*7c568831SAndroid Build Coastguard Worker doc = getDoc(2),
1505*7c568831SAndroid Build Coastguard Worker getInt(0));
1506*7c568831SAndroid Build Coastguard Worker if (copy != NULL)
1507*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1508*7c568831SAndroid Build Coastguard Worker setNode(0, checkCopy((xmlNodePtr) copy));
1509*7c568831SAndroid Build Coastguard Worker break;
1510*7c568831SAndroid Build Coastguard Worker }
1511*7c568831SAndroid Build Coastguard Worker
1512*7c568831SAndroid Build Coastguard Worker case OP_XML_DOC_COPY_NODE_LIST: {
1513*7c568831SAndroid Build Coastguard Worker xmlNodePtr copy;
1514*7c568831SAndroid Build Coastguard Worker
1515*7c568831SAndroid Build Coastguard Worker startOp("xmlDocCopyNodeList");
1516*7c568831SAndroid Build Coastguard Worker copy = xmlDocCopyNodeList(
1517*7c568831SAndroid Build Coastguard Worker getDoc(0),
1518*7c568831SAndroid Build Coastguard Worker getNode(1));
1519*7c568831SAndroid Build Coastguard Worker if (copy != NULL)
1520*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1521*7c568831SAndroid Build Coastguard Worker xmlFreeNodeList(copy);
1522*7c568831SAndroid Build Coastguard Worker endOp();
1523*7c568831SAndroid Build Coastguard Worker break;
1524*7c568831SAndroid Build Coastguard Worker }
1525*7c568831SAndroid Build Coastguard Worker
1526*7c568831SAndroid Build Coastguard Worker case OP_XML_COPY_PROP: {
1527*7c568831SAndroid Build Coastguard Worker xmlAttrPtr copy;
1528*7c568831SAndroid Build Coastguard Worker
1529*7c568831SAndroid Build Coastguard Worker startOp("xmlCopyProp");
1530*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1531*7c568831SAndroid Build Coastguard Worker copy = xmlCopyProp(
1532*7c568831SAndroid Build Coastguard Worker getNode(1),
1533*7c568831SAndroid Build Coastguard Worker getAttr(2));
1534*7c568831SAndroid Build Coastguard Worker /*
1535*7c568831SAndroid Build Coastguard Worker * TODO: Copying attributes can result in an empty list
1536*7c568831SAndroid Build Coastguard Worker * if there's a duplicate namespace prefix.
1537*7c568831SAndroid Build Coastguard Worker */
1538*7c568831SAndroid Build Coastguard Worker if (copy != NULL)
1539*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1540*7c568831SAndroid Build Coastguard Worker if (copy != NULL) {
1541*7c568831SAndroid Build Coastguard Worker /* Quirk */
1542*7c568831SAndroid Build Coastguard Worker copy->parent = NULL;
1543*7c568831SAndroid Build Coastguard Worker /* Fix namespace */
1544*7c568831SAndroid Build Coastguard Worker copy->ns = NULL;
1545*7c568831SAndroid Build Coastguard Worker }
1546*7c568831SAndroid Build Coastguard Worker setNode(0, checkCopy((xmlNodePtr) copy));
1547*7c568831SAndroid Build Coastguard Worker break;
1548*7c568831SAndroid Build Coastguard Worker }
1549*7c568831SAndroid Build Coastguard Worker
1550*7c568831SAndroid Build Coastguard Worker case OP_XML_COPY_PROP_LIST: {
1551*7c568831SAndroid Build Coastguard Worker xmlAttrPtr copy;
1552*7c568831SAndroid Build Coastguard Worker
1553*7c568831SAndroid Build Coastguard Worker startOp("xmlCopyPropList");
1554*7c568831SAndroid Build Coastguard Worker copy = xmlCopyPropList(
1555*7c568831SAndroid Build Coastguard Worker getNode(0),
1556*7c568831SAndroid Build Coastguard Worker getAttr(1));
1557*7c568831SAndroid Build Coastguard Worker if (copy != NULL)
1558*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1559*7c568831SAndroid Build Coastguard Worker xmlFreePropList(copy);
1560*7c568831SAndroid Build Coastguard Worker endOp();
1561*7c568831SAndroid Build Coastguard Worker break;
1562*7c568831SAndroid Build Coastguard Worker }
1563*7c568831SAndroid Build Coastguard Worker
1564*7c568831SAndroid Build Coastguard Worker case OP_XML_COPY_DTD: {
1565*7c568831SAndroid Build Coastguard Worker xmlDtdPtr dtd, copy;
1566*7c568831SAndroid Build Coastguard Worker
1567*7c568831SAndroid Build Coastguard Worker startOp("xmlCopyDtd");
1568*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1569*7c568831SAndroid Build Coastguard Worker copy = xmlCopyDtd(
1570*7c568831SAndroid Build Coastguard Worker dtd = getDtd(1));
1571*7c568831SAndroid Build Coastguard Worker oomReport = (dtd != NULL && copy == NULL);
1572*7c568831SAndroid Build Coastguard Worker setNode(0, checkCopy((xmlNodePtr) copy));
1573*7c568831SAndroid Build Coastguard Worker break;
1574*7c568831SAndroid Build Coastguard Worker }
1575*7c568831SAndroid Build Coastguard Worker
1576*7c568831SAndroid Build Coastguard Worker case OP_NODE_PARENT:
1577*7c568831SAndroid Build Coastguard Worker case OP_NODE_NEXT_SIBLING:
1578*7c568831SAndroid Build Coastguard Worker case OP_NODE_PREV_SIBLING:
1579*7c568831SAndroid Build Coastguard Worker case OP_NODE_FIRST_CHILD:
1580*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_LAST_CHILD:
1581*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_INT_SUBSET:
1582*7c568831SAndroid Build Coastguard Worker case OP_XML_DOC_GET_ROOT_ELEMENT:
1583*7c568831SAndroid Build Coastguard Worker opNodeAccessor(op);
1584*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1585*7c568831SAndroid Build Coastguard Worker break;
1586*7c568831SAndroid Build Coastguard Worker
1587*7c568831SAndroid Build Coastguard Worker case OP_NODE_NAME: {
1588*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1589*7c568831SAndroid Build Coastguard Worker
1590*7c568831SAndroid Build Coastguard Worker startOp("name");
1591*7c568831SAndroid Build Coastguard Worker incStrIdx();
1592*7c568831SAndroid Build Coastguard Worker node = getNode(0);
1593*7c568831SAndroid Build Coastguard Worker copyStr(0, node ? node->name : NULL);
1594*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1595*7c568831SAndroid Build Coastguard Worker endOp();
1596*7c568831SAndroid Build Coastguard Worker break;
1597*7c568831SAndroid Build Coastguard Worker }
1598*7c568831SAndroid Build Coastguard Worker
1599*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_SET_NAME:
1600*7c568831SAndroid Build Coastguard Worker startOp("xmlNodeSetName");
1601*7c568831SAndroid Build Coastguard Worker xmlNodeSetName(
1602*7c568831SAndroid Build Coastguard Worker getNode(0),
1603*7c568831SAndroid Build Coastguard Worker getStr(0));
1604*7c568831SAndroid Build Coastguard Worker endOp();
1605*7c568831SAndroid Build Coastguard Worker break;
1606*7c568831SAndroid Build Coastguard Worker
1607*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_GET_CONTENT: {
1608*7c568831SAndroid Build Coastguard Worker xmlChar *content;
1609*7c568831SAndroid Build Coastguard Worker
1610*7c568831SAndroid Build Coastguard Worker incStrIdx();
1611*7c568831SAndroid Build Coastguard Worker startOp("xmlNodeGetContent");
1612*7c568831SAndroid Build Coastguard Worker content = xmlNodeGetContent(getNode(0));
1613*7c568831SAndroid Build Coastguard Worker if (content != NULL)
1614*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1615*7c568831SAndroid Build Coastguard Worker moveStr(0, content);
1616*7c568831SAndroid Build Coastguard Worker endOp();
1617*7c568831SAndroid Build Coastguard Worker break;
1618*7c568831SAndroid Build Coastguard Worker }
1619*7c568831SAndroid Build Coastguard Worker
1620*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_SET_CONTENT: {
1621*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1622*7c568831SAndroid Build Coastguard Worker int res;
1623*7c568831SAndroid Build Coastguard Worker
1624*7c568831SAndroid Build Coastguard Worker startOp("xmlNodeSetContent");
1625*7c568831SAndroid Build Coastguard Worker node = getNode(0);
1626*7c568831SAndroid Build Coastguard Worker removeChildren(node, 0);
1627*7c568831SAndroid Build Coastguard Worker res = xmlNodeSetContent(
1628*7c568831SAndroid Build Coastguard Worker node,
1629*7c568831SAndroid Build Coastguard Worker getStr(0));
1630*7c568831SAndroid Build Coastguard Worker oomReport = (res < 0);
1631*7c568831SAndroid Build Coastguard Worker endOp();
1632*7c568831SAndroid Build Coastguard Worker break;
1633*7c568831SAndroid Build Coastguard Worker }
1634*7c568831SAndroid Build Coastguard Worker
1635*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_SET_CONTENT_LEN: {
1636*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1637*7c568831SAndroid Build Coastguard Worker const xmlChar *content;
1638*7c568831SAndroid Build Coastguard Worker int res;
1639*7c568831SAndroid Build Coastguard Worker
1640*7c568831SAndroid Build Coastguard Worker startOp("xmlNodeSetContentLen");
1641*7c568831SAndroid Build Coastguard Worker node = getNode(0);
1642*7c568831SAndroid Build Coastguard Worker content = getStr(0);
1643*7c568831SAndroid Build Coastguard Worker removeChildren(node, 0);
1644*7c568831SAndroid Build Coastguard Worker res = xmlNodeSetContentLen(
1645*7c568831SAndroid Build Coastguard Worker node,
1646*7c568831SAndroid Build Coastguard Worker content,
1647*7c568831SAndroid Build Coastguard Worker xmlStrlen(content));
1648*7c568831SAndroid Build Coastguard Worker oomReport = (res < 0);
1649*7c568831SAndroid Build Coastguard Worker endOp();
1650*7c568831SAndroid Build Coastguard Worker break;
1651*7c568831SAndroid Build Coastguard Worker }
1652*7c568831SAndroid Build Coastguard Worker
1653*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_ADD_CONTENT: {
1654*7c568831SAndroid Build Coastguard Worker xmlNodePtr node, text;
1655*7c568831SAndroid Build Coastguard Worker int res;
1656*7c568831SAndroid Build Coastguard Worker
1657*7c568831SAndroid Build Coastguard Worker startOp("xmlNodeAddContent");
1658*7c568831SAndroid Build Coastguard Worker node = getNode(0);
1659*7c568831SAndroid Build Coastguard Worker res = xmlNodeAddContent(
1660*7c568831SAndroid Build Coastguard Worker node,
1661*7c568831SAndroid Build Coastguard Worker getStr(0));
1662*7c568831SAndroid Build Coastguard Worker oomReport = (res < 0);
1663*7c568831SAndroid Build Coastguard Worker if (node != NULL) {
1664*7c568831SAndroid Build Coastguard Worker if (node->type == XML_ELEMENT_NODE ||
1665*7c568831SAndroid Build Coastguard Worker node->type == XML_DOCUMENT_FRAG_NODE)
1666*7c568831SAndroid Build Coastguard Worker text = node->last;
1667*7c568831SAndroid Build Coastguard Worker else
1668*7c568831SAndroid Build Coastguard Worker text = node;
1669*7c568831SAndroid Build Coastguard Worker checkContent(text);
1670*7c568831SAndroid Build Coastguard Worker }
1671*7c568831SAndroid Build Coastguard Worker endOp();
1672*7c568831SAndroid Build Coastguard Worker break;
1673*7c568831SAndroid Build Coastguard Worker }
1674*7c568831SAndroid Build Coastguard Worker
1675*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_ADD_CONTENT_LEN: {
1676*7c568831SAndroid Build Coastguard Worker xmlNodePtr node, text;
1677*7c568831SAndroid Build Coastguard Worker const xmlChar *content;
1678*7c568831SAndroid Build Coastguard Worker int res;
1679*7c568831SAndroid Build Coastguard Worker
1680*7c568831SAndroid Build Coastguard Worker startOp("xmlNodeAddContentLen");
1681*7c568831SAndroid Build Coastguard Worker node = getNode(0);
1682*7c568831SAndroid Build Coastguard Worker content = getStr(0);
1683*7c568831SAndroid Build Coastguard Worker res = xmlNodeAddContentLen(
1684*7c568831SAndroid Build Coastguard Worker node,
1685*7c568831SAndroid Build Coastguard Worker content,
1686*7c568831SAndroid Build Coastguard Worker xmlStrlen(content));
1687*7c568831SAndroid Build Coastguard Worker oomReport = res < 0;
1688*7c568831SAndroid Build Coastguard Worker if (node != NULL) {
1689*7c568831SAndroid Build Coastguard Worker if (node->type == XML_ELEMENT_NODE ||
1690*7c568831SAndroid Build Coastguard Worker node->type == XML_DOCUMENT_FRAG_NODE)
1691*7c568831SAndroid Build Coastguard Worker text = node->last;
1692*7c568831SAndroid Build Coastguard Worker else
1693*7c568831SAndroid Build Coastguard Worker text = node;
1694*7c568831SAndroid Build Coastguard Worker checkContent(text);
1695*7c568831SAndroid Build Coastguard Worker }
1696*7c568831SAndroid Build Coastguard Worker endOp();
1697*7c568831SAndroid Build Coastguard Worker break;
1698*7c568831SAndroid Build Coastguard Worker }
1699*7c568831SAndroid Build Coastguard Worker
1700*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_LINE_NO:
1701*7c568831SAndroid Build Coastguard Worker incIntIdx();
1702*7c568831SAndroid Build Coastguard Worker startOp("xmlGetLineNo");
1703*7c568831SAndroid Build Coastguard Worker setInt(0, xmlGetLineNo(getNode(0)));
1704*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1705*7c568831SAndroid Build Coastguard Worker endOp();
1706*7c568831SAndroid Build Coastguard Worker break;
1707*7c568831SAndroid Build Coastguard Worker
1708*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_NODE_PATH: {
1709*7c568831SAndroid Build Coastguard Worker xmlChar *path;
1710*7c568831SAndroid Build Coastguard Worker
1711*7c568831SAndroid Build Coastguard Worker incStrIdx();
1712*7c568831SAndroid Build Coastguard Worker startOp("xmlGetNodePath");
1713*7c568831SAndroid Build Coastguard Worker path = xmlGetNodePath(getNode(0));
1714*7c568831SAndroid Build Coastguard Worker if (path != NULL)
1715*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1716*7c568831SAndroid Build Coastguard Worker moveStr(0, path);
1717*7c568831SAndroid Build Coastguard Worker endOp();
1718*7c568831SAndroid Build Coastguard Worker break;
1719*7c568831SAndroid Build Coastguard Worker }
1720*7c568831SAndroid Build Coastguard Worker
1721*7c568831SAndroid Build Coastguard Worker case OP_XML_DOC_SET_ROOT_ELEMENT: {
1722*7c568831SAndroid Build Coastguard Worker xmlDocPtr oldDoc, doc;
1723*7c568831SAndroid Build Coastguard Worker xmlNodePtr oldRoot, oldParent, root;
1724*7c568831SAndroid Build Coastguard Worker
1725*7c568831SAndroid Build Coastguard Worker startOp("xmlDocSetRootElement");
1726*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1727*7c568831SAndroid Build Coastguard Worker doc = getDoc(1);
1728*7c568831SAndroid Build Coastguard Worker root = getNode(2);
1729*7c568831SAndroid Build Coastguard Worker if (doc != NULL && doc->parent != NULL)
1730*7c568831SAndroid Build Coastguard Worker doc = NULL;
1731*7c568831SAndroid Build Coastguard Worker if (!isValidChild((xmlNodePtr) doc, root))
1732*7c568831SAndroid Build Coastguard Worker root = NULL;
1733*7c568831SAndroid Build Coastguard Worker oldDoc = root ? root->doc : NULL;
1734*7c568831SAndroid Build Coastguard Worker oldParent = root ? root->parent : NULL;
1735*7c568831SAndroid Build Coastguard Worker
1736*7c568831SAndroid Build Coastguard Worker oldRoot = xmlDocSetRootElement(doc, root);
1737*7c568831SAndroid Build Coastguard Worker /* We can't really know whether xmlSetTreeDoc failed */
1738*7c568831SAndroid Build Coastguard Worker if (oldRoot != NULL ||
1739*7c568831SAndroid Build Coastguard Worker root == NULL ||
1740*7c568831SAndroid Build Coastguard Worker root->doc == oldDoc)
1741*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1742*7c568831SAndroid Build Coastguard Worker setNode(0, oldRoot);
1743*7c568831SAndroid Build Coastguard Worker
1744*7c568831SAndroid Build Coastguard Worker if (root &&
1745*7c568831SAndroid Build Coastguard Worker (root->parent != oldParent ||
1746*7c568831SAndroid Build Coastguard Worker root->doc != oldDoc)) {
1747*7c568831SAndroid Build Coastguard Worker if (fixNs(root) < 0)
1748*7c568831SAndroid Build Coastguard Worker oomReport = 1;
1749*7c568831SAndroid Build Coastguard Worker if (oldParent != NULL)
1750*7c568831SAndroid Build Coastguard Worker dropNode(oldParent);
1751*7c568831SAndroid Build Coastguard Worker else
1752*7c568831SAndroid Build Coastguard Worker dropNode((xmlNodePtr) oldDoc);
1753*7c568831SAndroid Build Coastguard Worker }
1754*7c568831SAndroid Build Coastguard Worker endOp();
1755*7c568831SAndroid Build Coastguard Worker break;
1756*7c568831SAndroid Build Coastguard Worker }
1757*7c568831SAndroid Build Coastguard Worker
1758*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_IS_TEXT:
1759*7c568831SAndroid Build Coastguard Worker incIntIdx();
1760*7c568831SAndroid Build Coastguard Worker startOp("xmlNodeIsText");
1761*7c568831SAndroid Build Coastguard Worker setInt(0, xmlNodeIsText(getNode(0)));
1762*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1763*7c568831SAndroid Build Coastguard Worker endOp();
1764*7c568831SAndroid Build Coastguard Worker break;
1765*7c568831SAndroid Build Coastguard Worker
1766*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_GET_ATTR_VALUE: {
1767*7c568831SAndroid Build Coastguard Worker xmlChar *value = NULL;
1768*7c568831SAndroid Build Coastguard Worker int res;
1769*7c568831SAndroid Build Coastguard Worker
1770*7c568831SAndroid Build Coastguard Worker incStrIdx();
1771*7c568831SAndroid Build Coastguard Worker startOp("xmlNodeGetAttrValue");
1772*7c568831SAndroid Build Coastguard Worker res = xmlNodeGetAttrValue(
1773*7c568831SAndroid Build Coastguard Worker getNode(0),
1774*7c568831SAndroid Build Coastguard Worker getStr(1),
1775*7c568831SAndroid Build Coastguard Worker getStr(2),
1776*7c568831SAndroid Build Coastguard Worker &value);
1777*7c568831SAndroid Build Coastguard Worker oomReport = (res < 0);
1778*7c568831SAndroid Build Coastguard Worker moveStr(0, value);
1779*7c568831SAndroid Build Coastguard Worker endOp();
1780*7c568831SAndroid Build Coastguard Worker break;
1781*7c568831SAndroid Build Coastguard Worker }
1782*7c568831SAndroid Build Coastguard Worker
1783*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_GET_LANG: {
1784*7c568831SAndroid Build Coastguard Worker xmlChar *lang;
1785*7c568831SAndroid Build Coastguard Worker
1786*7c568831SAndroid Build Coastguard Worker incStrIdx();
1787*7c568831SAndroid Build Coastguard Worker startOp("xmlNodeGetLang");
1788*7c568831SAndroid Build Coastguard Worker lang = xmlNodeGetLang(getNode(0));
1789*7c568831SAndroid Build Coastguard Worker if (lang != NULL)
1790*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1791*7c568831SAndroid Build Coastguard Worker moveStr(0, lang);
1792*7c568831SAndroid Build Coastguard Worker endOp();
1793*7c568831SAndroid Build Coastguard Worker break;
1794*7c568831SAndroid Build Coastguard Worker }
1795*7c568831SAndroid Build Coastguard Worker
1796*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_SET_LANG: {
1797*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1798*7c568831SAndroid Build Coastguard Worker xmlAttrPtr attr;
1799*7c568831SAndroid Build Coastguard Worker int res;
1800*7c568831SAndroid Build Coastguard Worker
1801*7c568831SAndroid Build Coastguard Worker startOp("xmlNodeSetLang");
1802*7c568831SAndroid Build Coastguard Worker node = getNode(0);
1803*7c568831SAndroid Build Coastguard Worker attr = xmlHasNsProp(
1804*7c568831SAndroid Build Coastguard Worker node,
1805*7c568831SAndroid Build Coastguard Worker BAD_CAST "lang",
1806*7c568831SAndroid Build Coastguard Worker XML_XML_NAMESPACE);
1807*7c568831SAndroid Build Coastguard Worker xmlFuzzResetMallocFailed();
1808*7c568831SAndroid Build Coastguard Worker removeChildren((xmlNodePtr) attr, 0);
1809*7c568831SAndroid Build Coastguard Worker res = xmlNodeSetLang(
1810*7c568831SAndroid Build Coastguard Worker node,
1811*7c568831SAndroid Build Coastguard Worker getStr(0));
1812*7c568831SAndroid Build Coastguard Worker oomReport = (res < 0);
1813*7c568831SAndroid Build Coastguard Worker endOp();
1814*7c568831SAndroid Build Coastguard Worker break;
1815*7c568831SAndroid Build Coastguard Worker }
1816*7c568831SAndroid Build Coastguard Worker
1817*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_GET_SPACE_PRESERVE: {
1818*7c568831SAndroid Build Coastguard Worker int res;
1819*7c568831SAndroid Build Coastguard Worker
1820*7c568831SAndroid Build Coastguard Worker incIntIdx();
1821*7c568831SAndroid Build Coastguard Worker startOp("xmlNodeGetSpacePreserve");
1822*7c568831SAndroid Build Coastguard Worker res = xmlNodeGetSpacePreserve(getNode(0));
1823*7c568831SAndroid Build Coastguard Worker if (res >= 0)
1824*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1825*7c568831SAndroid Build Coastguard Worker setInt(0, res);
1826*7c568831SAndroid Build Coastguard Worker endOp();
1827*7c568831SAndroid Build Coastguard Worker break;
1828*7c568831SAndroid Build Coastguard Worker }
1829*7c568831SAndroid Build Coastguard Worker
1830*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_SET_SPACE_PRESERVE: {
1831*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1832*7c568831SAndroid Build Coastguard Worker xmlAttrPtr attr;
1833*7c568831SAndroid Build Coastguard Worker int res;
1834*7c568831SAndroid Build Coastguard Worker
1835*7c568831SAndroid Build Coastguard Worker startOp("xmlNodeSetSpacePreserve");
1836*7c568831SAndroid Build Coastguard Worker node = getNode(0);
1837*7c568831SAndroid Build Coastguard Worker attr = xmlHasNsProp(
1838*7c568831SAndroid Build Coastguard Worker node,
1839*7c568831SAndroid Build Coastguard Worker BAD_CAST "space",
1840*7c568831SAndroid Build Coastguard Worker XML_XML_NAMESPACE);
1841*7c568831SAndroid Build Coastguard Worker xmlFuzzResetMallocFailed();
1842*7c568831SAndroid Build Coastguard Worker removeChildren((xmlNodePtr) attr, 0);
1843*7c568831SAndroid Build Coastguard Worker res = xmlNodeSetSpacePreserve(
1844*7c568831SAndroid Build Coastguard Worker node,
1845*7c568831SAndroid Build Coastguard Worker getInt(0));
1846*7c568831SAndroid Build Coastguard Worker oomReport = (res < 0);
1847*7c568831SAndroid Build Coastguard Worker endOp();
1848*7c568831SAndroid Build Coastguard Worker break;
1849*7c568831SAndroid Build Coastguard Worker }
1850*7c568831SAndroid Build Coastguard Worker
1851*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_GET_BASE: {
1852*7c568831SAndroid Build Coastguard Worker xmlChar *base;
1853*7c568831SAndroid Build Coastguard Worker
1854*7c568831SAndroid Build Coastguard Worker incStrIdx();
1855*7c568831SAndroid Build Coastguard Worker startOp("xmlNodeGetBase");
1856*7c568831SAndroid Build Coastguard Worker base = xmlNodeGetBase(
1857*7c568831SAndroid Build Coastguard Worker getDoc(0),
1858*7c568831SAndroid Build Coastguard Worker getNode(1));
1859*7c568831SAndroid Build Coastguard Worker if (base != NULL)
1860*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1861*7c568831SAndroid Build Coastguard Worker moveStr(0, base);
1862*7c568831SAndroid Build Coastguard Worker endOp();
1863*7c568831SAndroid Build Coastguard Worker break;
1864*7c568831SAndroid Build Coastguard Worker }
1865*7c568831SAndroid Build Coastguard Worker
1866*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_GET_BASE_SAFE: {
1867*7c568831SAndroid Build Coastguard Worker xmlChar *base;
1868*7c568831SAndroid Build Coastguard Worker int res;
1869*7c568831SAndroid Build Coastguard Worker
1870*7c568831SAndroid Build Coastguard Worker startOp("xmlNodeGetBaseSafe");
1871*7c568831SAndroid Build Coastguard Worker incStrIdx();
1872*7c568831SAndroid Build Coastguard Worker res = xmlNodeGetBaseSafe(
1873*7c568831SAndroid Build Coastguard Worker getDoc(0),
1874*7c568831SAndroid Build Coastguard Worker getNode(1),
1875*7c568831SAndroid Build Coastguard Worker &base);
1876*7c568831SAndroid Build Coastguard Worker oomReport = (res < 0);
1877*7c568831SAndroid Build Coastguard Worker moveStr(0, base);
1878*7c568831SAndroid Build Coastguard Worker endOp();
1879*7c568831SAndroid Build Coastguard Worker break;
1880*7c568831SAndroid Build Coastguard Worker }
1881*7c568831SAndroid Build Coastguard Worker
1882*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_SET_BASE: {
1883*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1884*7c568831SAndroid Build Coastguard Worker xmlAttrPtr attr;
1885*7c568831SAndroid Build Coastguard Worker int res;
1886*7c568831SAndroid Build Coastguard Worker
1887*7c568831SAndroid Build Coastguard Worker startOp("xmlNodeSetBase");
1888*7c568831SAndroid Build Coastguard Worker node = getNode(0);
1889*7c568831SAndroid Build Coastguard Worker attr = xmlHasNsProp(
1890*7c568831SAndroid Build Coastguard Worker node,
1891*7c568831SAndroid Build Coastguard Worker BAD_CAST "base",
1892*7c568831SAndroid Build Coastguard Worker XML_XML_NAMESPACE);
1893*7c568831SAndroid Build Coastguard Worker xmlFuzzResetMallocFailed();
1894*7c568831SAndroid Build Coastguard Worker removeChildren((xmlNodePtr) attr, 0);
1895*7c568831SAndroid Build Coastguard Worker res = xmlNodeSetBase(
1896*7c568831SAndroid Build Coastguard Worker node,
1897*7c568831SAndroid Build Coastguard Worker getStr(0));
1898*7c568831SAndroid Build Coastguard Worker if (res == 0)
1899*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1900*7c568831SAndroid Build Coastguard Worker endOp();
1901*7c568831SAndroid Build Coastguard Worker break;
1902*7c568831SAndroid Build Coastguard Worker }
1903*7c568831SAndroid Build Coastguard Worker
1904*7c568831SAndroid Build Coastguard Worker case OP_XML_IS_BLANK_NODE:
1905*7c568831SAndroid Build Coastguard Worker startOp("xmlIsBlankNode");
1906*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1907*7c568831SAndroid Build Coastguard Worker setInt(0, xmlIsBlankNode(getNode(0)));
1908*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1909*7c568831SAndroid Build Coastguard Worker break;
1910*7c568831SAndroid Build Coastguard Worker
1911*7c568831SAndroid Build Coastguard Worker case OP_XML_HAS_PROP: {
1912*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1913*7c568831SAndroid Build Coastguard Worker xmlAttrPtr attr;
1914*7c568831SAndroid Build Coastguard Worker
1915*7c568831SAndroid Build Coastguard Worker startOp("xmlHasProp");
1916*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1917*7c568831SAndroid Build Coastguard Worker attr = xmlHasProp(
1918*7c568831SAndroid Build Coastguard Worker node = getNode(1),
1919*7c568831SAndroid Build Coastguard Worker getStr(0));
1920*7c568831SAndroid Build Coastguard Worker if (node != NULL &&
1921*7c568831SAndroid Build Coastguard Worker node->doc != NULL &&
1922*7c568831SAndroid Build Coastguard Worker node->doc->intSubset != NULL) {
1923*7c568831SAndroid Build Coastguard Worker /*
1924*7c568831SAndroid Build Coastguard Worker * xmlHasProp tries to look up default attributes,
1925*7c568831SAndroid Build Coastguard Worker * requiring a memory allocation which isn't
1926*7c568831SAndroid Build Coastguard Worker * checked.
1927*7c568831SAndroid Build Coastguard Worker */
1928*7c568831SAndroid Build Coastguard Worker if (attr != NULL)
1929*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1930*7c568831SAndroid Build Coastguard Worker } else {
1931*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1932*7c568831SAndroid Build Coastguard Worker }
1933*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) attr);
1934*7c568831SAndroid Build Coastguard Worker break;
1935*7c568831SAndroid Build Coastguard Worker }
1936*7c568831SAndroid Build Coastguard Worker
1937*7c568831SAndroid Build Coastguard Worker case OP_XML_HAS_NS_PROP: {
1938*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
1939*7c568831SAndroid Build Coastguard Worker xmlAttrPtr attr;
1940*7c568831SAndroid Build Coastguard Worker
1941*7c568831SAndroid Build Coastguard Worker startOp("xmlHasNsProp");
1942*7c568831SAndroid Build Coastguard Worker incNodeIdx();
1943*7c568831SAndroid Build Coastguard Worker attr = xmlHasNsProp(
1944*7c568831SAndroid Build Coastguard Worker node = getNode(1),
1945*7c568831SAndroid Build Coastguard Worker getStr(0),
1946*7c568831SAndroid Build Coastguard Worker getStr(1));
1947*7c568831SAndroid Build Coastguard Worker if (node != NULL &&
1948*7c568831SAndroid Build Coastguard Worker node->doc != NULL &&
1949*7c568831SAndroid Build Coastguard Worker node->doc->intSubset != NULL) {
1950*7c568831SAndroid Build Coastguard Worker if (attr != NULL)
1951*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1952*7c568831SAndroid Build Coastguard Worker } else {
1953*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1954*7c568831SAndroid Build Coastguard Worker }
1955*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) attr);
1956*7c568831SAndroid Build Coastguard Worker break;
1957*7c568831SAndroid Build Coastguard Worker }
1958*7c568831SAndroid Build Coastguard Worker
1959*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_PROP: {
1960*7c568831SAndroid Build Coastguard Worker xmlChar *content;
1961*7c568831SAndroid Build Coastguard Worker
1962*7c568831SAndroid Build Coastguard Worker startOp("xmlGetProp");
1963*7c568831SAndroid Build Coastguard Worker incStrIdx();
1964*7c568831SAndroid Build Coastguard Worker content = xmlGetProp(
1965*7c568831SAndroid Build Coastguard Worker getNode(0),
1966*7c568831SAndroid Build Coastguard Worker getStr(1));
1967*7c568831SAndroid Build Coastguard Worker if (content != NULL)
1968*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1969*7c568831SAndroid Build Coastguard Worker moveStr(0, content);
1970*7c568831SAndroid Build Coastguard Worker endOp();
1971*7c568831SAndroid Build Coastguard Worker break;
1972*7c568831SAndroid Build Coastguard Worker }
1973*7c568831SAndroid Build Coastguard Worker
1974*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_NS_PROP: {
1975*7c568831SAndroid Build Coastguard Worker xmlChar *content;
1976*7c568831SAndroid Build Coastguard Worker
1977*7c568831SAndroid Build Coastguard Worker startOp("xmlGetNsProp");
1978*7c568831SAndroid Build Coastguard Worker incStrIdx();
1979*7c568831SAndroid Build Coastguard Worker content = xmlGetNsProp(
1980*7c568831SAndroid Build Coastguard Worker getNode(0),
1981*7c568831SAndroid Build Coastguard Worker getStr(1),
1982*7c568831SAndroid Build Coastguard Worker getStr(2));
1983*7c568831SAndroid Build Coastguard Worker if (content != NULL)
1984*7c568831SAndroid Build Coastguard Worker oomReport = 0;
1985*7c568831SAndroid Build Coastguard Worker moveStr(0, content);
1986*7c568831SAndroid Build Coastguard Worker endOp();
1987*7c568831SAndroid Build Coastguard Worker break;
1988*7c568831SAndroid Build Coastguard Worker }
1989*7c568831SAndroid Build Coastguard Worker
1990*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_NO_NS_PROP: {
1991*7c568831SAndroid Build Coastguard Worker xmlChar *content;
1992*7c568831SAndroid Build Coastguard Worker
1993*7c568831SAndroid Build Coastguard Worker startOp("xmlGetNoNsProp");
1994*7c568831SAndroid Build Coastguard Worker incStrIdx();
1995*7c568831SAndroid Build Coastguard Worker content = xmlGetNoNsProp(
1996*7c568831SAndroid Build Coastguard Worker getNode(0),
1997*7c568831SAndroid Build Coastguard Worker getStr(1));
1998*7c568831SAndroid Build Coastguard Worker if (content != NULL)
1999*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2000*7c568831SAndroid Build Coastguard Worker moveStr(0, content);
2001*7c568831SAndroid Build Coastguard Worker endOp();
2002*7c568831SAndroid Build Coastguard Worker break;
2003*7c568831SAndroid Build Coastguard Worker }
2004*7c568831SAndroid Build Coastguard Worker
2005*7c568831SAndroid Build Coastguard Worker case OP_XML_SET_PROP: {
2006*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
2007*7c568831SAndroid Build Coastguard Worker xmlAttrPtr oldAttr, attr;
2008*7c568831SAndroid Build Coastguard Worker xmlNsPtr ns = NULL;
2009*7c568831SAndroid Build Coastguard Worker const xmlChar *name, *value, *localName;
2010*7c568831SAndroid Build Coastguard Worker xmlChar *prefix;
2011*7c568831SAndroid Build Coastguard Worker int prefixLen;
2012*7c568831SAndroid Build Coastguard Worker
2013*7c568831SAndroid Build Coastguard Worker startOp("xmlSetProp");
2014*7c568831SAndroid Build Coastguard Worker incNodeIdx();
2015*7c568831SAndroid Build Coastguard Worker node = getNode(1);
2016*7c568831SAndroid Build Coastguard Worker name = getStr(0);
2017*7c568831SAndroid Build Coastguard Worker value = getStr(1);
2018*7c568831SAndroid Build Coastguard Worker
2019*7c568831SAndroid Build Coastguard Worker /*
2020*7c568831SAndroid Build Coastguard Worker * Find the old attribute node which will be deleted.
2021*7c568831SAndroid Build Coastguard Worker */
2022*7c568831SAndroid Build Coastguard Worker localName = xmlSplitQName3(name, &prefixLen);
2023*7c568831SAndroid Build Coastguard Worker if (localName != NULL) {
2024*7c568831SAndroid Build Coastguard Worker prefix = uncheckedStrndup(name, prefixLen);
2025*7c568831SAndroid Build Coastguard Worker ns = xmlSearchNs(NULL, node, prefix);
2026*7c568831SAndroid Build Coastguard Worker xmlFree(prefix);
2027*7c568831SAndroid Build Coastguard Worker }
2028*7c568831SAndroid Build Coastguard Worker if (ns == NULL)
2029*7c568831SAndroid Build Coastguard Worker oldAttr = xmlHasNsProp(node, name, NULL);
2030*7c568831SAndroid Build Coastguard Worker else
2031*7c568831SAndroid Build Coastguard Worker oldAttr = xmlHasNsProp(node, localName, ns->href);
2032*7c568831SAndroid Build Coastguard Worker xmlFuzzResetMallocFailed();
2033*7c568831SAndroid Build Coastguard Worker if (oldAttr != NULL)
2034*7c568831SAndroid Build Coastguard Worker removeChildren((xmlNodePtr) oldAttr, 0);
2035*7c568831SAndroid Build Coastguard Worker
2036*7c568831SAndroid Build Coastguard Worker attr = xmlSetProp(node, name, value);
2037*7c568831SAndroid Build Coastguard Worker
2038*7c568831SAndroid Build Coastguard Worker oomReport =
2039*7c568831SAndroid Build Coastguard Worker (node != NULL && node->type == XML_ELEMENT_NODE &&
2040*7c568831SAndroid Build Coastguard Worker name != NULL &&
2041*7c568831SAndroid Build Coastguard Worker attr == NULL);
2042*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) attr);
2043*7c568831SAndroid Build Coastguard Worker break;
2044*7c568831SAndroid Build Coastguard Worker }
2045*7c568831SAndroid Build Coastguard Worker
2046*7c568831SAndroid Build Coastguard Worker case OP_XML_SET_NS_PROP: {
2047*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
2048*7c568831SAndroid Build Coastguard Worker xmlNsPtr ns;
2049*7c568831SAndroid Build Coastguard Worker xmlAttrPtr oldAttr, attr;
2050*7c568831SAndroid Build Coastguard Worker const xmlChar *name, *value;
2051*7c568831SAndroid Build Coastguard Worker
2052*7c568831SAndroid Build Coastguard Worker startOp("xmlSetNsProp");
2053*7c568831SAndroid Build Coastguard Worker incNodeIdx();
2054*7c568831SAndroid Build Coastguard Worker node = getNode(1);
2055*7c568831SAndroid Build Coastguard Worker ns = nodeGetNs(getNode(2), getInt(0));
2056*7c568831SAndroid Build Coastguard Worker name = getStr(0);
2057*7c568831SAndroid Build Coastguard Worker value = getStr(1);
2058*7c568831SAndroid Build Coastguard Worker oldAttr = xmlHasNsProp(node, name, ns ? ns->href : NULL);
2059*7c568831SAndroid Build Coastguard Worker xmlFuzzResetMallocFailed();
2060*7c568831SAndroid Build Coastguard Worker if (oldAttr != NULL)
2061*7c568831SAndroid Build Coastguard Worker removeChildren((xmlNodePtr) oldAttr, 0);
2062*7c568831SAndroid Build Coastguard Worker attr = xmlSetNsProp(node, ns, name, value);
2063*7c568831SAndroid Build Coastguard Worker oomReport =
2064*7c568831SAndroid Build Coastguard Worker ((node == NULL || node->type == XML_ELEMENT_NODE) &&
2065*7c568831SAndroid Build Coastguard Worker (ns == NULL || ns->href != NULL) &&
2066*7c568831SAndroid Build Coastguard Worker name != NULL &&
2067*7c568831SAndroid Build Coastguard Worker attr == NULL);
2068*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) attr);
2069*7c568831SAndroid Build Coastguard Worker if (ns != NULL) {
2070*7c568831SAndroid Build Coastguard Worker if (fixNs((xmlNodePtr) attr) < 0)
2071*7c568831SAndroid Build Coastguard Worker oomReport = 1;
2072*7c568831SAndroid Build Coastguard Worker }
2073*7c568831SAndroid Build Coastguard Worker break;
2074*7c568831SAndroid Build Coastguard Worker }
2075*7c568831SAndroid Build Coastguard Worker
2076*7c568831SAndroid Build Coastguard Worker case OP_XML_REMOVE_PROP: {
2077*7c568831SAndroid Build Coastguard Worker xmlNodePtr attr, parent = NULL;
2078*7c568831SAndroid Build Coastguard Worker
2079*7c568831SAndroid Build Coastguard Worker startOp("xmlRemoveProp");
2080*7c568831SAndroid Build Coastguard Worker incIntIdx();
2081*7c568831SAndroid Build Coastguard Worker attr = getNode(0);
2082*7c568831SAndroid Build Coastguard Worker if (attr != NULL) {
2083*7c568831SAndroid Build Coastguard Worker if (attr->parent != NULL &&
2084*7c568831SAndroid Build Coastguard Worker attr->type == XML_ATTRIBUTE_NODE)
2085*7c568831SAndroid Build Coastguard Worker removeChildren(attr, 1);
2086*7c568831SAndroid Build Coastguard Worker else
2087*7c568831SAndroid Build Coastguard Worker attr = NULL;
2088*7c568831SAndroid Build Coastguard Worker }
2089*7c568831SAndroid Build Coastguard Worker if (attr != NULL)
2090*7c568831SAndroid Build Coastguard Worker parent = attr->parent;
2091*7c568831SAndroid Build Coastguard Worker setInt(0, xmlRemoveProp((xmlAttrPtr) attr));
2092*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2093*7c568831SAndroid Build Coastguard Worker dropNode(parent);
2094*7c568831SAndroid Build Coastguard Worker endOp();
2095*7c568831SAndroid Build Coastguard Worker break;
2096*7c568831SAndroid Build Coastguard Worker }
2097*7c568831SAndroid Build Coastguard Worker
2098*7c568831SAndroid Build Coastguard Worker case OP_XML_UNSET_PROP: {
2099*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
2100*7c568831SAndroid Build Coastguard Worker xmlAttrPtr attr;
2101*7c568831SAndroid Build Coastguard Worker const xmlChar *name;
2102*7c568831SAndroid Build Coastguard Worker
2103*7c568831SAndroid Build Coastguard Worker startOp("xmlUnsetProp");
2104*7c568831SAndroid Build Coastguard Worker incIntIdx();
2105*7c568831SAndroid Build Coastguard Worker node = getNode(0);
2106*7c568831SAndroid Build Coastguard Worker name = getStr(0);
2107*7c568831SAndroid Build Coastguard Worker attr = xmlHasNsProp(node, name, NULL);
2108*7c568831SAndroid Build Coastguard Worker xmlFuzzResetMallocFailed();
2109*7c568831SAndroid Build Coastguard Worker if (attr != NULL)
2110*7c568831SAndroid Build Coastguard Worker removeChildren((xmlNodePtr) attr, 1);
2111*7c568831SAndroid Build Coastguard Worker setInt(0, xmlUnsetProp(node, name));
2112*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2113*7c568831SAndroid Build Coastguard Worker dropNode(node);
2114*7c568831SAndroid Build Coastguard Worker endOp();
2115*7c568831SAndroid Build Coastguard Worker break;
2116*7c568831SAndroid Build Coastguard Worker }
2117*7c568831SAndroid Build Coastguard Worker
2118*7c568831SAndroid Build Coastguard Worker case OP_XML_UNSET_NS_PROP: {
2119*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
2120*7c568831SAndroid Build Coastguard Worker xmlNsPtr ns;
2121*7c568831SAndroid Build Coastguard Worker xmlAttrPtr attr;
2122*7c568831SAndroid Build Coastguard Worker const xmlChar *name;
2123*7c568831SAndroid Build Coastguard Worker
2124*7c568831SAndroid Build Coastguard Worker startOp("xmlUnsetNsProp");
2125*7c568831SAndroid Build Coastguard Worker incIntIdx();
2126*7c568831SAndroid Build Coastguard Worker node = getNode(0);
2127*7c568831SAndroid Build Coastguard Worker ns = nodeGetNs(getNode(1), getInt(1));
2128*7c568831SAndroid Build Coastguard Worker name = getStr(0);
2129*7c568831SAndroid Build Coastguard Worker attr = xmlHasNsProp(node, name, ns ? ns->href : NULL);
2130*7c568831SAndroid Build Coastguard Worker xmlFuzzResetMallocFailed();
2131*7c568831SAndroid Build Coastguard Worker if (attr != NULL)
2132*7c568831SAndroid Build Coastguard Worker removeChildren((xmlNodePtr) attr, 1);
2133*7c568831SAndroid Build Coastguard Worker setInt(0, xmlUnsetNsProp(node, ns, name));
2134*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2135*7c568831SAndroid Build Coastguard Worker dropNode(node);
2136*7c568831SAndroid Build Coastguard Worker endOp();
2137*7c568831SAndroid Build Coastguard Worker break;
2138*7c568831SAndroid Build Coastguard Worker }
2139*7c568831SAndroid Build Coastguard Worker
2140*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_NS: {
2141*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
2142*7c568831SAndroid Build Coastguard Worker xmlNsPtr ns;
2143*7c568831SAndroid Build Coastguard Worker
2144*7c568831SAndroid Build Coastguard Worker startOp("xmlNewNs");
2145*7c568831SAndroid Build Coastguard Worker ns = xmlNewNs(
2146*7c568831SAndroid Build Coastguard Worker node = getNode(0),
2147*7c568831SAndroid Build Coastguard Worker getStr(0),
2148*7c568831SAndroid Build Coastguard Worker getStr(1));
2149*7c568831SAndroid Build Coastguard Worker if (ns != NULL)
2150*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2151*7c568831SAndroid Build Coastguard Worker if (node == NULL)
2152*7c568831SAndroid Build Coastguard Worker xmlFreeNs(ns);
2153*7c568831SAndroid Build Coastguard Worker endOp();
2154*7c568831SAndroid Build Coastguard Worker break;
2155*7c568831SAndroid Build Coastguard Worker }
2156*7c568831SAndroid Build Coastguard Worker
2157*7c568831SAndroid Build Coastguard Worker case OP_XML_SEARCH_NS: {
2158*7c568831SAndroid Build Coastguard Worker xmlNsPtr ns;
2159*7c568831SAndroid Build Coastguard Worker
2160*7c568831SAndroid Build Coastguard Worker startOp("xmlSearchNs");
2161*7c568831SAndroid Build Coastguard Worker ns = xmlSearchNs(
2162*7c568831SAndroid Build Coastguard Worker getDoc(0),
2163*7c568831SAndroid Build Coastguard Worker getNode(1),
2164*7c568831SAndroid Build Coastguard Worker getStr(0));
2165*7c568831SAndroid Build Coastguard Worker if (ns != NULL)
2166*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2167*7c568831SAndroid Build Coastguard Worker endOp();
2168*7c568831SAndroid Build Coastguard Worker break;
2169*7c568831SAndroid Build Coastguard Worker }
2170*7c568831SAndroid Build Coastguard Worker
2171*7c568831SAndroid Build Coastguard Worker case OP_XML_SEARCH_NS_BY_HREF: {
2172*7c568831SAndroid Build Coastguard Worker xmlNsPtr ns;
2173*7c568831SAndroid Build Coastguard Worker
2174*7c568831SAndroid Build Coastguard Worker startOp("xmlSearchNsByHref");
2175*7c568831SAndroid Build Coastguard Worker ns = xmlSearchNsByHref(
2176*7c568831SAndroid Build Coastguard Worker getDoc(0),
2177*7c568831SAndroid Build Coastguard Worker getNode(1),
2178*7c568831SAndroid Build Coastguard Worker getStr(0));
2179*7c568831SAndroid Build Coastguard Worker if (ns != NULL)
2180*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2181*7c568831SAndroid Build Coastguard Worker endOp();
2182*7c568831SAndroid Build Coastguard Worker break;
2183*7c568831SAndroid Build Coastguard Worker }
2184*7c568831SAndroid Build Coastguard Worker
2185*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_NS_LIST: {
2186*7c568831SAndroid Build Coastguard Worker xmlNsPtr *list;
2187*7c568831SAndroid Build Coastguard Worker
2188*7c568831SAndroid Build Coastguard Worker startOp("xmlGetNsList");
2189*7c568831SAndroid Build Coastguard Worker list = xmlGetNsList(
2190*7c568831SAndroid Build Coastguard Worker getDoc(0),
2191*7c568831SAndroid Build Coastguard Worker getNode(1));
2192*7c568831SAndroid Build Coastguard Worker if (list != NULL)
2193*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2194*7c568831SAndroid Build Coastguard Worker xmlFree(list);
2195*7c568831SAndroid Build Coastguard Worker endOp();
2196*7c568831SAndroid Build Coastguard Worker break;
2197*7c568831SAndroid Build Coastguard Worker }
2198*7c568831SAndroid Build Coastguard Worker
2199*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_NS_LIST_SAFE: {
2200*7c568831SAndroid Build Coastguard Worker xmlNsPtr *list;
2201*7c568831SAndroid Build Coastguard Worker int res;
2202*7c568831SAndroid Build Coastguard Worker
2203*7c568831SAndroid Build Coastguard Worker startOp("xmlGetNsList");
2204*7c568831SAndroid Build Coastguard Worker res = xmlGetNsListSafe(
2205*7c568831SAndroid Build Coastguard Worker getDoc(0),
2206*7c568831SAndroid Build Coastguard Worker getNode(1),
2207*7c568831SAndroid Build Coastguard Worker &list);
2208*7c568831SAndroid Build Coastguard Worker oomReport = (res < 0);
2209*7c568831SAndroid Build Coastguard Worker xmlFree(list);
2210*7c568831SAndroid Build Coastguard Worker endOp();
2211*7c568831SAndroid Build Coastguard Worker break;
2212*7c568831SAndroid Build Coastguard Worker }
2213*7c568831SAndroid Build Coastguard Worker
2214*7c568831SAndroid Build Coastguard Worker case OP_XML_SET_NS: {
2215*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
2216*7c568831SAndroid Build Coastguard Worker xmlNsPtr ns;
2217*7c568831SAndroid Build Coastguard Worker
2218*7c568831SAndroid Build Coastguard Worker startOp("xmlSetNs");
2219*7c568831SAndroid Build Coastguard Worker node = getNode(0),
2220*7c568831SAndroid Build Coastguard Worker ns = nodeGetNs(getNode(1), getInt(0));
2221*7c568831SAndroid Build Coastguard Worker xmlSetNs(node, ns);
2222*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2223*7c568831SAndroid Build Coastguard Worker if (ns != NULL) {
2224*7c568831SAndroid Build Coastguard Worker if (fixNs(node) < 0)
2225*7c568831SAndroid Build Coastguard Worker oomReport = 1;
2226*7c568831SAndroid Build Coastguard Worker }
2227*7c568831SAndroid Build Coastguard Worker endOp();
2228*7c568831SAndroid Build Coastguard Worker break;
2229*7c568831SAndroid Build Coastguard Worker }
2230*7c568831SAndroid Build Coastguard Worker
2231*7c568831SAndroid Build Coastguard Worker case OP_XML_COPY_NAMESPACE: {
2232*7c568831SAndroid Build Coastguard Worker xmlNsPtr ns, copy;
2233*7c568831SAndroid Build Coastguard Worker
2234*7c568831SAndroid Build Coastguard Worker startOp("xmlCopyNamespace");
2235*7c568831SAndroid Build Coastguard Worker copy = xmlCopyNamespace(
2236*7c568831SAndroid Build Coastguard Worker ns = nodeGetNs(getNode(0), getInt(0)));
2237*7c568831SAndroid Build Coastguard Worker oomReport = (ns != NULL && copy == NULL);
2238*7c568831SAndroid Build Coastguard Worker xmlFreeNs(copy);
2239*7c568831SAndroid Build Coastguard Worker endOp();
2240*7c568831SAndroid Build Coastguard Worker break;
2241*7c568831SAndroid Build Coastguard Worker }
2242*7c568831SAndroid Build Coastguard Worker
2243*7c568831SAndroid Build Coastguard Worker case OP_XML_COPY_NAMESPACE_LIST: {
2244*7c568831SAndroid Build Coastguard Worker xmlNsPtr list, copy;
2245*7c568831SAndroid Build Coastguard Worker
2246*7c568831SAndroid Build Coastguard Worker startOp("xmlCopyNamespaceList");
2247*7c568831SAndroid Build Coastguard Worker copy = xmlCopyNamespaceList(
2248*7c568831SAndroid Build Coastguard Worker list = nodeGetNs(getNode(0), getInt(0)));
2249*7c568831SAndroid Build Coastguard Worker oomReport = (list != NULL && copy == NULL);
2250*7c568831SAndroid Build Coastguard Worker xmlFreeNsList(copy);
2251*7c568831SAndroid Build Coastguard Worker endOp();
2252*7c568831SAndroid Build Coastguard Worker break;
2253*7c568831SAndroid Build Coastguard Worker }
2254*7c568831SAndroid Build Coastguard Worker
2255*7c568831SAndroid Build Coastguard Worker case OP_XML_UNLINK_NODE: {
2256*7c568831SAndroid Build Coastguard Worker xmlNodePtr node, oldParent;
2257*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
2258*7c568831SAndroid Build Coastguard Worker
2259*7c568831SAndroid Build Coastguard Worker startOp("xmlUnlinkNode");
2260*7c568831SAndroid Build Coastguard Worker node = getNode(0);
2261*7c568831SAndroid Build Coastguard Worker doc = node ? node->doc : NULL;
2262*7c568831SAndroid Build Coastguard Worker /*
2263*7c568831SAndroid Build Coastguard Worker * Unlinking DTD children can cause invalid references
2264*7c568831SAndroid Build Coastguard Worker * which would be expensive to fix.
2265*7c568831SAndroid Build Coastguard Worker *
2266*7c568831SAndroid Build Coastguard Worker * Don't unlink DTD if it is the internal or external
2267*7c568831SAndroid Build Coastguard Worker * subset of the document.
2268*7c568831SAndroid Build Coastguard Worker */
2269*7c568831SAndroid Build Coastguard Worker if (node != NULL &&
2270*7c568831SAndroid Build Coastguard Worker (isDtdChild(node) ||
2271*7c568831SAndroid Build Coastguard Worker (node->type == XML_DTD_NODE &&
2272*7c568831SAndroid Build Coastguard Worker doc != NULL &&
2273*7c568831SAndroid Build Coastguard Worker ((xmlDtdPtr) node == doc->intSubset ||
2274*7c568831SAndroid Build Coastguard Worker (xmlDtdPtr) node == doc->extSubset))))
2275*7c568831SAndroid Build Coastguard Worker node = NULL;
2276*7c568831SAndroid Build Coastguard Worker oldParent = node ? node->parent : NULL;
2277*7c568831SAndroid Build Coastguard Worker xmlUnlinkNode(node);
2278*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2279*7c568831SAndroid Build Coastguard Worker if (node != NULL && node->parent != oldParent) {
2280*7c568831SAndroid Build Coastguard Worker if (fixNs(node) < 0)
2281*7c568831SAndroid Build Coastguard Worker oomReport = 1;
2282*7c568831SAndroid Build Coastguard Worker dropNode(oldParent);
2283*7c568831SAndroid Build Coastguard Worker }
2284*7c568831SAndroid Build Coastguard Worker endOp();
2285*7c568831SAndroid Build Coastguard Worker break;
2286*7c568831SAndroid Build Coastguard Worker }
2287*7c568831SAndroid Build Coastguard Worker
2288*7c568831SAndroid Build Coastguard Worker case OP_XML_REPLACE_NODE: {
2289*7c568831SAndroid Build Coastguard Worker xmlNodePtr old, oldParent, node, oldNodeParent, result;
2290*7c568831SAndroid Build Coastguard Worker xmlDocPtr oldDoc, oldNodeDoc;
2291*7c568831SAndroid Build Coastguard Worker
2292*7c568831SAndroid Build Coastguard Worker startOp("xmlReplaceNode");
2293*7c568831SAndroid Build Coastguard Worker old = getNode(0);
2294*7c568831SAndroid Build Coastguard Worker node = getNode(1);
2295*7c568831SAndroid Build Coastguard Worker
2296*7c568831SAndroid Build Coastguard Worker /*
2297*7c568831SAndroid Build Coastguard Worker * Unlinking DTD children can cause invalid references
2298*7c568831SAndroid Build Coastguard Worker * which would be expensive to fix.
2299*7c568831SAndroid Build Coastguard Worker *
2300*7c568831SAndroid Build Coastguard Worker * Don't unlink DTD if it is the internal or external
2301*7c568831SAndroid Build Coastguard Worker * subset of the document.
2302*7c568831SAndroid Build Coastguard Worker */
2303*7c568831SAndroid Build Coastguard Worker old = old ? old->parent : NULL;
2304*7c568831SAndroid Build Coastguard Worker oldDoc = old ? old->doc : NULL;
2305*7c568831SAndroid Build Coastguard Worker if (old != NULL &&
2306*7c568831SAndroid Build Coastguard Worker (isDtdChild(old) ||
2307*7c568831SAndroid Build Coastguard Worker (old->type == XML_DTD_NODE &&
2308*7c568831SAndroid Build Coastguard Worker oldDoc != NULL &&
2309*7c568831SAndroid Build Coastguard Worker ((xmlDtdPtr) old == oldDoc->intSubset ||
2310*7c568831SAndroid Build Coastguard Worker (xmlDtdPtr) old == oldDoc->extSubset))))
2311*7c568831SAndroid Build Coastguard Worker old = NULL;
2312*7c568831SAndroid Build Coastguard Worker if (old != NULL && !isValidChild(old->parent, node))
2313*7c568831SAndroid Build Coastguard Worker node = NULL;
2314*7c568831SAndroid Build Coastguard Worker
2315*7c568831SAndroid Build Coastguard Worker oldParent = old ? old->parent : NULL;
2316*7c568831SAndroid Build Coastguard Worker oldNodeParent = node ? node->parent : NULL;
2317*7c568831SAndroid Build Coastguard Worker oldNodeDoc = node ? node->doc : NULL;
2318*7c568831SAndroid Build Coastguard Worker
2319*7c568831SAndroid Build Coastguard Worker result = xmlReplaceNode(old, node);
2320*7c568831SAndroid Build Coastguard Worker oomReport =
2321*7c568831SAndroid Build Coastguard Worker (old != NULL && old->parent != NULL &&
2322*7c568831SAndroid Build Coastguard Worker node != NULL &&
2323*7c568831SAndroid Build Coastguard Worker old != node &&
2324*7c568831SAndroid Build Coastguard Worker result == NULL);
2325*7c568831SAndroid Build Coastguard Worker
2326*7c568831SAndroid Build Coastguard Worker if (old != NULL && old->parent != oldParent) {
2327*7c568831SAndroid Build Coastguard Worker if (fixNs(old) < 0)
2328*7c568831SAndroid Build Coastguard Worker oomReport = 1;
2329*7c568831SAndroid Build Coastguard Worker }
2330*7c568831SAndroid Build Coastguard Worker if (node == NULL) {
2331*7c568831SAndroid Build Coastguard Worker /* Old node was unlinked */
2332*7c568831SAndroid Build Coastguard Worker dropNode(oldParent);
2333*7c568831SAndroid Build Coastguard Worker } else if (node->parent != oldNodeParent ||
2334*7c568831SAndroid Build Coastguard Worker node->doc != oldNodeDoc) {
2335*7c568831SAndroid Build Coastguard Worker if (fixNs(node) < 0)
2336*7c568831SAndroid Build Coastguard Worker oomReport = 1;
2337*7c568831SAndroid Build Coastguard Worker /* Drop old parent of new node */
2338*7c568831SAndroid Build Coastguard Worker if (oldNodeParent != NULL)
2339*7c568831SAndroid Build Coastguard Worker dropNode(oldNodeParent);
2340*7c568831SAndroid Build Coastguard Worker else
2341*7c568831SAndroid Build Coastguard Worker dropNode((xmlNodePtr) oldNodeDoc);
2342*7c568831SAndroid Build Coastguard Worker }
2343*7c568831SAndroid Build Coastguard Worker endOp();
2344*7c568831SAndroid Build Coastguard Worker break;
2345*7c568831SAndroid Build Coastguard Worker }
2346*7c568831SAndroid Build Coastguard Worker
2347*7c568831SAndroid Build Coastguard Worker case OP_XML_ADD_CHILD:
2348*7c568831SAndroid Build Coastguard Worker case OP_XML_ADD_SIBLING:
2349*7c568831SAndroid Build Coastguard Worker case OP_XML_ADD_PREV_SIBLING:
2350*7c568831SAndroid Build Coastguard Worker case OP_XML_ADD_NEXT_SIBLING: {
2351*7c568831SAndroid Build Coastguard Worker xmlNodePtr target, parent, node, oldNodeParent, result;
2352*7c568831SAndroid Build Coastguard Worker xmlDocPtr oldNodeDoc;
2353*7c568831SAndroid Build Coastguard Worker int argsOk;
2354*7c568831SAndroid Build Coastguard Worker
2355*7c568831SAndroid Build Coastguard Worker switch (op) {
2356*7c568831SAndroid Build Coastguard Worker case OP_XML_ADD_CHILD:
2357*7c568831SAndroid Build Coastguard Worker startOp("xmlAddChild"); break;
2358*7c568831SAndroid Build Coastguard Worker case OP_XML_ADD_SIBLING:
2359*7c568831SAndroid Build Coastguard Worker startOp("xmlAddSibling"); break;
2360*7c568831SAndroid Build Coastguard Worker case OP_XML_ADD_PREV_SIBLING:
2361*7c568831SAndroid Build Coastguard Worker startOp("xmlAddPrevSibling"); break;
2362*7c568831SAndroid Build Coastguard Worker case OP_XML_ADD_NEXT_SIBLING:
2363*7c568831SAndroid Build Coastguard Worker startOp("xmlAddNextSibling"); break;
2364*7c568831SAndroid Build Coastguard Worker }
2365*7c568831SAndroid Build Coastguard Worker
2366*7c568831SAndroid Build Coastguard Worker if (op == OP_XML_ADD_CHILD) {
2367*7c568831SAndroid Build Coastguard Worker target = NULL;
2368*7c568831SAndroid Build Coastguard Worker parent = getNode(0);
2369*7c568831SAndroid Build Coastguard Worker } else {
2370*7c568831SAndroid Build Coastguard Worker target = getNode(0);
2371*7c568831SAndroid Build Coastguard Worker parent = target ? target->parent : NULL;
2372*7c568831SAndroid Build Coastguard Worker }
2373*7c568831SAndroid Build Coastguard Worker node = getNode(1);
2374*7c568831SAndroid Build Coastguard Worker
2375*7c568831SAndroid Build Coastguard Worker /* Don't append to root node */
2376*7c568831SAndroid Build Coastguard Worker if (target != NULL && parent == NULL)
2377*7c568831SAndroid Build Coastguard Worker node = NULL;
2378*7c568831SAndroid Build Coastguard Worker
2379*7c568831SAndroid Build Coastguard Worker /* Check tree structure */
2380*7c568831SAndroid Build Coastguard Worker if (isDtdChild(node) ||
2381*7c568831SAndroid Build Coastguard Worker !isValidChild(parent, node))
2382*7c568831SAndroid Build Coastguard Worker node = NULL;
2383*7c568831SAndroid Build Coastguard Worker
2384*7c568831SAndroid Build Coastguard Worker /* Attributes */
2385*7c568831SAndroid Build Coastguard Worker if (node != NULL && node->type == XML_ATTRIBUTE_NODE) {
2386*7c568831SAndroid Build Coastguard Worker if ((op == OP_XML_ADD_CHILD) ||
2387*7c568831SAndroid Build Coastguard Worker ((target != NULL &&
2388*7c568831SAndroid Build Coastguard Worker (target->type == XML_ATTRIBUTE_NODE)))) {
2389*7c568831SAndroid Build Coastguard Worker xmlAttrPtr attr = xmlHasNsProp(parent, node->name,
2390*7c568831SAndroid Build Coastguard Worker node->ns ? node->ns->href : NULL);
2391*7c568831SAndroid Build Coastguard Worker
2392*7c568831SAndroid Build Coastguard Worker xmlFuzzResetMallocFailed();
2393*7c568831SAndroid Build Coastguard Worker /* Attribute might be replaced */
2394*7c568831SAndroid Build Coastguard Worker if (attr != NULL && attr != (xmlAttrPtr) node)
2395*7c568831SAndroid Build Coastguard Worker removeChildren((xmlNodePtr) attr, 1);
2396*7c568831SAndroid Build Coastguard Worker } else {
2397*7c568831SAndroid Build Coastguard Worker target = NULL;
2398*7c568831SAndroid Build Coastguard Worker }
2399*7c568831SAndroid Build Coastguard Worker } else if (target != NULL &&
2400*7c568831SAndroid Build Coastguard Worker target->type == XML_ATTRIBUTE_NODE) {
2401*7c568831SAndroid Build Coastguard Worker node = NULL;
2402*7c568831SAndroid Build Coastguard Worker }
2403*7c568831SAndroid Build Coastguard Worker
2404*7c568831SAndroid Build Coastguard Worker oldNodeParent = node ? node->parent : NULL;
2405*7c568831SAndroid Build Coastguard Worker oldNodeDoc = node ? node->doc : NULL;
2406*7c568831SAndroid Build Coastguard Worker argsOk =
2407*7c568831SAndroid Build Coastguard Worker (target != NULL &&
2408*7c568831SAndroid Build Coastguard Worker node != NULL &&
2409*7c568831SAndroid Build Coastguard Worker target != node);
2410*7c568831SAndroid Build Coastguard Worker
2411*7c568831SAndroid Build Coastguard Worker switch (op) {
2412*7c568831SAndroid Build Coastguard Worker case OP_XML_ADD_CHILD:
2413*7c568831SAndroid Build Coastguard Worker argsOk = (parent != NULL && node != NULL);
2414*7c568831SAndroid Build Coastguard Worker result = xmlAddChild(parent, node);
2415*7c568831SAndroid Build Coastguard Worker break;
2416*7c568831SAndroid Build Coastguard Worker case OP_XML_ADD_SIBLING:
2417*7c568831SAndroid Build Coastguard Worker result = xmlAddSibling(target, node);
2418*7c568831SAndroid Build Coastguard Worker break;
2419*7c568831SAndroid Build Coastguard Worker case OP_XML_ADD_PREV_SIBLING:
2420*7c568831SAndroid Build Coastguard Worker result = xmlAddPrevSibling(target, node);
2421*7c568831SAndroid Build Coastguard Worker break;
2422*7c568831SAndroid Build Coastguard Worker case OP_XML_ADD_NEXT_SIBLING:
2423*7c568831SAndroid Build Coastguard Worker result = xmlAddNextSibling(target, node);
2424*7c568831SAndroid Build Coastguard Worker break;
2425*7c568831SAndroid Build Coastguard Worker }
2426*7c568831SAndroid Build Coastguard Worker oomReport = (argsOk && result == NULL);
2427*7c568831SAndroid Build Coastguard Worker
2428*7c568831SAndroid Build Coastguard Worker if (result != NULL && result != node) {
2429*7c568831SAndroid Build Coastguard Worker /* Text node was merged */
2430*7c568831SAndroid Build Coastguard Worker removeNode(node);
2431*7c568831SAndroid Build Coastguard Worker checkContent(result);
2432*7c568831SAndroid Build Coastguard Worker /* Drop old parent of node */
2433*7c568831SAndroid Build Coastguard Worker if (oldNodeParent != NULL)
2434*7c568831SAndroid Build Coastguard Worker dropNode(oldNodeParent);
2435*7c568831SAndroid Build Coastguard Worker else
2436*7c568831SAndroid Build Coastguard Worker dropNode((xmlNodePtr) oldNodeDoc);
2437*7c568831SAndroid Build Coastguard Worker } else if (node != NULL &&
2438*7c568831SAndroid Build Coastguard Worker (node->parent != oldNodeParent ||
2439*7c568831SAndroid Build Coastguard Worker node->doc != oldNodeDoc)) {
2440*7c568831SAndroid Build Coastguard Worker if (fixNs(node) < 0)
2441*7c568831SAndroid Build Coastguard Worker oomReport = 1;
2442*7c568831SAndroid Build Coastguard Worker /* Drop old parent of node */
2443*7c568831SAndroid Build Coastguard Worker if (oldNodeParent != NULL)
2444*7c568831SAndroid Build Coastguard Worker dropNode(oldNodeParent);
2445*7c568831SAndroid Build Coastguard Worker else
2446*7c568831SAndroid Build Coastguard Worker dropNode((xmlNodePtr) oldNodeDoc);
2447*7c568831SAndroid Build Coastguard Worker }
2448*7c568831SAndroid Build Coastguard Worker
2449*7c568831SAndroid Build Coastguard Worker endOp();
2450*7c568831SAndroid Build Coastguard Worker break;
2451*7c568831SAndroid Build Coastguard Worker }
2452*7c568831SAndroid Build Coastguard Worker
2453*7c568831SAndroid Build Coastguard Worker case OP_XML_TEXT_MERGE: {
2454*7c568831SAndroid Build Coastguard Worker xmlNodePtr first, second, parent = NULL, res;
2455*7c568831SAndroid Build Coastguard Worker int argsOk;
2456*7c568831SAndroid Build Coastguard Worker
2457*7c568831SAndroid Build Coastguard Worker startOp("xmlTextMerge");
2458*7c568831SAndroid Build Coastguard Worker first = getNode(0);
2459*7c568831SAndroid Build Coastguard Worker second = getNode(1);
2460*7c568831SAndroid Build Coastguard Worker argsOk =
2461*7c568831SAndroid Build Coastguard Worker (first != NULL && first->type == XML_TEXT_NODE &&
2462*7c568831SAndroid Build Coastguard Worker second != NULL && second->type == XML_TEXT_NODE &&
2463*7c568831SAndroid Build Coastguard Worker first != second &&
2464*7c568831SAndroid Build Coastguard Worker first->name == second->name);
2465*7c568831SAndroid Build Coastguard Worker if (argsOk) {
2466*7c568831SAndroid Build Coastguard Worker if (second->parent != NULL)
2467*7c568831SAndroid Build Coastguard Worker parent = second->parent;
2468*7c568831SAndroid Build Coastguard Worker else
2469*7c568831SAndroid Build Coastguard Worker parent = (xmlNodePtr) second->doc;
2470*7c568831SAndroid Build Coastguard Worker
2471*7c568831SAndroid Build Coastguard Worker }
2472*7c568831SAndroid Build Coastguard Worker res = xmlTextMerge(first, second);
2473*7c568831SAndroid Build Coastguard Worker oomReport = (argsOk && res == NULL);
2474*7c568831SAndroid Build Coastguard Worker if (res != NULL) {
2475*7c568831SAndroid Build Coastguard Worker removeNode(second);
2476*7c568831SAndroid Build Coastguard Worker dropNode(parent);
2477*7c568831SAndroid Build Coastguard Worker checkContent(first);
2478*7c568831SAndroid Build Coastguard Worker }
2479*7c568831SAndroid Build Coastguard Worker endOp();
2480*7c568831SAndroid Build Coastguard Worker break;
2481*7c568831SAndroid Build Coastguard Worker }
2482*7c568831SAndroid Build Coastguard Worker
2483*7c568831SAndroid Build Coastguard Worker case OP_XML_TEXT_CONCAT: {
2484*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
2485*7c568831SAndroid Build Coastguard Worker const xmlChar *text;
2486*7c568831SAndroid Build Coastguard Worker int res;
2487*7c568831SAndroid Build Coastguard Worker
2488*7c568831SAndroid Build Coastguard Worker startOp("xmlTextConcat");
2489*7c568831SAndroid Build Coastguard Worker node = getNode(0);
2490*7c568831SAndroid Build Coastguard Worker text = getStr(0);
2491*7c568831SAndroid Build Coastguard Worker res = xmlTextConcat(
2492*7c568831SAndroid Build Coastguard Worker node,
2493*7c568831SAndroid Build Coastguard Worker text,
2494*7c568831SAndroid Build Coastguard Worker xmlStrlen(text));
2495*7c568831SAndroid Build Coastguard Worker oomReport = (isTextContentNode(node) && res < 0);
2496*7c568831SAndroid Build Coastguard Worker checkContent(node);
2497*7c568831SAndroid Build Coastguard Worker endOp();
2498*7c568831SAndroid Build Coastguard Worker break;
2499*7c568831SAndroid Build Coastguard Worker }
2500*7c568831SAndroid Build Coastguard Worker
2501*7c568831SAndroid Build Coastguard Worker case OP_XML_STRING_GET_NODE_LIST: {
2502*7c568831SAndroid Build Coastguard Worker xmlNodePtr list;
2503*7c568831SAndroid Build Coastguard Worker const xmlChar *value;
2504*7c568831SAndroid Build Coastguard Worker
2505*7c568831SAndroid Build Coastguard Worker startOp("xmlStringGetNodeList");
2506*7c568831SAndroid Build Coastguard Worker list = xmlStringGetNodeList(
2507*7c568831SAndroid Build Coastguard Worker getDoc(0),
2508*7c568831SAndroid Build Coastguard Worker value = getStr(0));
2509*7c568831SAndroid Build Coastguard Worker oomReport = (value != NULL && value[0] != 0 && list == NULL);
2510*7c568831SAndroid Build Coastguard Worker xmlFreeNodeList(list);
2511*7c568831SAndroid Build Coastguard Worker endOp();
2512*7c568831SAndroid Build Coastguard Worker break;
2513*7c568831SAndroid Build Coastguard Worker }
2514*7c568831SAndroid Build Coastguard Worker
2515*7c568831SAndroid Build Coastguard Worker case OP_XML_STRING_LEN_GET_NODE_LIST: {
2516*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
2517*7c568831SAndroid Build Coastguard Worker xmlNodePtr list;
2518*7c568831SAndroid Build Coastguard Worker const xmlChar *value;
2519*7c568831SAndroid Build Coastguard Worker
2520*7c568831SAndroid Build Coastguard Worker startOp("xmlStringLenGetNodeList");
2521*7c568831SAndroid Build Coastguard Worker doc = getDoc(0);
2522*7c568831SAndroid Build Coastguard Worker value = getStr(0);
2523*7c568831SAndroid Build Coastguard Worker list = xmlStringLenGetNodeList(
2524*7c568831SAndroid Build Coastguard Worker doc,
2525*7c568831SAndroid Build Coastguard Worker value,
2526*7c568831SAndroid Build Coastguard Worker xmlStrlen(value));
2527*7c568831SAndroid Build Coastguard Worker oomReport = (value != NULL && value[0] != 0 && list == NULL);
2528*7c568831SAndroid Build Coastguard Worker xmlFreeNodeList(list);
2529*7c568831SAndroid Build Coastguard Worker endOp();
2530*7c568831SAndroid Build Coastguard Worker break;
2531*7c568831SAndroid Build Coastguard Worker }
2532*7c568831SAndroid Build Coastguard Worker
2533*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_LIST_GET_STRING: {
2534*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
2535*7c568831SAndroid Build Coastguard Worker xmlNodePtr list;
2536*7c568831SAndroid Build Coastguard Worker xmlChar *string;
2537*7c568831SAndroid Build Coastguard Worker
2538*7c568831SAndroid Build Coastguard Worker startOp("xmlNodeListGetString");
2539*7c568831SAndroid Build Coastguard Worker incStrIdx();
2540*7c568831SAndroid Build Coastguard Worker doc = getDoc(0);
2541*7c568831SAndroid Build Coastguard Worker list = getNode(1);
2542*7c568831SAndroid Build Coastguard Worker string = xmlNodeListGetString(
2543*7c568831SAndroid Build Coastguard Worker doc,
2544*7c568831SAndroid Build Coastguard Worker list,
2545*7c568831SAndroid Build Coastguard Worker getInt(0));
2546*7c568831SAndroid Build Coastguard Worker oomReport = (list != NULL && string == NULL);
2547*7c568831SAndroid Build Coastguard Worker moveStr(0, string);
2548*7c568831SAndroid Build Coastguard Worker endOp();
2549*7c568831SAndroid Build Coastguard Worker break;
2550*7c568831SAndroid Build Coastguard Worker }
2551*7c568831SAndroid Build Coastguard Worker
2552*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_LIST_GET_RAW_STRING: {
2553*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
2554*7c568831SAndroid Build Coastguard Worker xmlNodePtr list;
2555*7c568831SAndroid Build Coastguard Worker xmlChar *string;
2556*7c568831SAndroid Build Coastguard Worker
2557*7c568831SAndroid Build Coastguard Worker startOp("xmlNodeListGetRawString");
2558*7c568831SAndroid Build Coastguard Worker incStrIdx();
2559*7c568831SAndroid Build Coastguard Worker doc = getDoc(0);
2560*7c568831SAndroid Build Coastguard Worker list = getNode(1);
2561*7c568831SAndroid Build Coastguard Worker string = xmlNodeListGetRawString(
2562*7c568831SAndroid Build Coastguard Worker doc,
2563*7c568831SAndroid Build Coastguard Worker list,
2564*7c568831SAndroid Build Coastguard Worker getInt(0));
2565*7c568831SAndroid Build Coastguard Worker oomReport = (list != NULL && string == NULL);
2566*7c568831SAndroid Build Coastguard Worker moveStr(0, string);
2567*7c568831SAndroid Build Coastguard Worker endOp();
2568*7c568831SAndroid Build Coastguard Worker break;
2569*7c568831SAndroid Build Coastguard Worker }
2570*7c568831SAndroid Build Coastguard Worker
2571*7c568831SAndroid Build Coastguard Worker case OP_XML_IS_XHTML:
2572*7c568831SAndroid Build Coastguard Worker startOp("xmlIsXHTML");
2573*7c568831SAndroid Build Coastguard Worker incIntIdx();
2574*7c568831SAndroid Build Coastguard Worker setInt(0, xmlIsXHTML(
2575*7c568831SAndroid Build Coastguard Worker getStr(0),
2576*7c568831SAndroid Build Coastguard Worker getStr(1)));
2577*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2578*7c568831SAndroid Build Coastguard Worker break;
2579*7c568831SAndroid Build Coastguard Worker
2580*7c568831SAndroid Build Coastguard Worker case OP_XML_ADD_ELEMENT_DECL: {
2581*7c568831SAndroid Build Coastguard Worker xmlElementPtr decl;
2582*7c568831SAndroid Build Coastguard Worker
2583*7c568831SAndroid Build Coastguard Worker startOp("xmlAddElementDecl");
2584*7c568831SAndroid Build Coastguard Worker incNodeIdx();
2585*7c568831SAndroid Build Coastguard Worker decl = xmlAddElementDecl(
2586*7c568831SAndroid Build Coastguard Worker NULL,
2587*7c568831SAndroid Build Coastguard Worker getDtd(1),
2588*7c568831SAndroid Build Coastguard Worker getStr(0),
2589*7c568831SAndroid Build Coastguard Worker (xmlElementTypeVal) getInt(0),
2590*7c568831SAndroid Build Coastguard Worker NULL);
2591*7c568831SAndroid Build Coastguard Worker if (decl != NULL)
2592*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2593*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) decl);
2594*7c568831SAndroid Build Coastguard Worker break;
2595*7c568831SAndroid Build Coastguard Worker }
2596*7c568831SAndroid Build Coastguard Worker
2597*7c568831SAndroid Build Coastguard Worker case OP_XML_ADD_ATTRIBUTE_DECL: {
2598*7c568831SAndroid Build Coastguard Worker xmlAttributePtr decl;
2599*7c568831SAndroid Build Coastguard Worker
2600*7c568831SAndroid Build Coastguard Worker startOp("xmlAddAttributeDecl");
2601*7c568831SAndroid Build Coastguard Worker incNodeIdx();
2602*7c568831SAndroid Build Coastguard Worker decl = xmlAddAttributeDecl(
2603*7c568831SAndroid Build Coastguard Worker NULL,
2604*7c568831SAndroid Build Coastguard Worker getDtd(1),
2605*7c568831SAndroid Build Coastguard Worker getStr(0),
2606*7c568831SAndroid Build Coastguard Worker getStr(1),
2607*7c568831SAndroid Build Coastguard Worker getStr(2),
2608*7c568831SAndroid Build Coastguard Worker (xmlAttributeType) getInt(0),
2609*7c568831SAndroid Build Coastguard Worker (xmlAttributeDefault) getInt(1),
2610*7c568831SAndroid Build Coastguard Worker getStr(3),
2611*7c568831SAndroid Build Coastguard Worker NULL);
2612*7c568831SAndroid Build Coastguard Worker if (decl != NULL)
2613*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2614*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) decl);
2615*7c568831SAndroid Build Coastguard Worker break;
2616*7c568831SAndroid Build Coastguard Worker }
2617*7c568831SAndroid Build Coastguard Worker
2618*7c568831SAndroid Build Coastguard Worker case OP_XML_ADD_NOTATION_DECL: {
2619*7c568831SAndroid Build Coastguard Worker xmlNotationPtr decl;
2620*7c568831SAndroid Build Coastguard Worker
2621*7c568831SAndroid Build Coastguard Worker startOp("xmlAddNotationDecl");
2622*7c568831SAndroid Build Coastguard Worker decl = xmlAddNotationDecl(
2623*7c568831SAndroid Build Coastguard Worker NULL,
2624*7c568831SAndroid Build Coastguard Worker getDtd(1),
2625*7c568831SAndroid Build Coastguard Worker getStr(0),
2626*7c568831SAndroid Build Coastguard Worker getStr(1),
2627*7c568831SAndroid Build Coastguard Worker getStr(2));
2628*7c568831SAndroid Build Coastguard Worker if (decl != NULL)
2629*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2630*7c568831SAndroid Build Coastguard Worker endOp();
2631*7c568831SAndroid Build Coastguard Worker break;
2632*7c568831SAndroid Build Coastguard Worker }
2633*7c568831SAndroid Build Coastguard Worker
2634*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_DTD_ELEMENT_DESC: {
2635*7c568831SAndroid Build Coastguard Worker xmlElementPtr elem;
2636*7c568831SAndroid Build Coastguard Worker
2637*7c568831SAndroid Build Coastguard Worker startOp("xmlGetDtdElementDesc");
2638*7c568831SAndroid Build Coastguard Worker incNodeIdx();
2639*7c568831SAndroid Build Coastguard Worker elem = xmlGetDtdElementDesc(
2640*7c568831SAndroid Build Coastguard Worker getDtd(1),
2641*7c568831SAndroid Build Coastguard Worker getStr(0));
2642*7c568831SAndroid Build Coastguard Worker if (elem != NULL)
2643*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2644*7c568831SAndroid Build Coastguard Worker /*
2645*7c568831SAndroid Build Coastguard Worker * Don't reference XML_ELEMENT_TYPE_UNDEFINED dummy
2646*7c568831SAndroid Build Coastguard Worker * declarations.
2647*7c568831SAndroid Build Coastguard Worker */
2648*7c568831SAndroid Build Coastguard Worker if (elem != NULL && elem->parent == NULL)
2649*7c568831SAndroid Build Coastguard Worker elem = NULL;
2650*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) elem);
2651*7c568831SAndroid Build Coastguard Worker break;
2652*7c568831SAndroid Build Coastguard Worker }
2653*7c568831SAndroid Build Coastguard Worker
2654*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_DTD_QELEMENT_DESC: {
2655*7c568831SAndroid Build Coastguard Worker xmlElementPtr elem;
2656*7c568831SAndroid Build Coastguard Worker
2657*7c568831SAndroid Build Coastguard Worker startOp("xmlGetDtdQElementDesc");
2658*7c568831SAndroid Build Coastguard Worker incNodeIdx();
2659*7c568831SAndroid Build Coastguard Worker elem = xmlGetDtdQElementDesc(
2660*7c568831SAndroid Build Coastguard Worker getDtd(1),
2661*7c568831SAndroid Build Coastguard Worker getStr(0),
2662*7c568831SAndroid Build Coastguard Worker getStr(1));
2663*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2664*7c568831SAndroid Build Coastguard Worker if (elem != NULL && elem->parent == NULL)
2665*7c568831SAndroid Build Coastguard Worker elem = NULL;
2666*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) elem);
2667*7c568831SAndroid Build Coastguard Worker break;
2668*7c568831SAndroid Build Coastguard Worker }
2669*7c568831SAndroid Build Coastguard Worker
2670*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_DTD_ATTR_DESC: {
2671*7c568831SAndroid Build Coastguard Worker xmlAttributePtr decl;
2672*7c568831SAndroid Build Coastguard Worker
2673*7c568831SAndroid Build Coastguard Worker startOp("xmlGetDtdAttrDesc");
2674*7c568831SAndroid Build Coastguard Worker incNodeIdx();
2675*7c568831SAndroid Build Coastguard Worker decl = xmlGetDtdAttrDesc(
2676*7c568831SAndroid Build Coastguard Worker getDtd(1),
2677*7c568831SAndroid Build Coastguard Worker getStr(0),
2678*7c568831SAndroid Build Coastguard Worker getStr(1));
2679*7c568831SAndroid Build Coastguard Worker if (decl != NULL)
2680*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2681*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) decl);
2682*7c568831SAndroid Build Coastguard Worker break;
2683*7c568831SAndroid Build Coastguard Worker }
2684*7c568831SAndroid Build Coastguard Worker
2685*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_DTD_QATTR_DESC: {
2686*7c568831SAndroid Build Coastguard Worker xmlAttributePtr decl;
2687*7c568831SAndroid Build Coastguard Worker
2688*7c568831SAndroid Build Coastguard Worker startOp("xmlGetDtdQAttrDesc");
2689*7c568831SAndroid Build Coastguard Worker incNodeIdx();
2690*7c568831SAndroid Build Coastguard Worker decl = xmlGetDtdQAttrDesc(
2691*7c568831SAndroid Build Coastguard Worker getDtd(1),
2692*7c568831SAndroid Build Coastguard Worker getStr(0),
2693*7c568831SAndroid Build Coastguard Worker getStr(1),
2694*7c568831SAndroid Build Coastguard Worker getStr(2));
2695*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2696*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) decl);
2697*7c568831SAndroid Build Coastguard Worker break;
2698*7c568831SAndroid Build Coastguard Worker }
2699*7c568831SAndroid Build Coastguard Worker
2700*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_DTD_NOTATION_DESC:
2701*7c568831SAndroid Build Coastguard Worker startOp("xmlGetDtdNotationDesc");
2702*7c568831SAndroid Build Coastguard Worker xmlGetDtdNotationDesc(
2703*7c568831SAndroid Build Coastguard Worker getDtd(1),
2704*7c568831SAndroid Build Coastguard Worker getStr(0));
2705*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2706*7c568831SAndroid Build Coastguard Worker endOp();
2707*7c568831SAndroid Build Coastguard Worker break;
2708*7c568831SAndroid Build Coastguard Worker
2709*7c568831SAndroid Build Coastguard Worker case OP_XML_ADD_ID:
2710*7c568831SAndroid Build Coastguard Worker startOp("xmlAddID");
2711*7c568831SAndroid Build Coastguard Worker xmlAddID(
2712*7c568831SAndroid Build Coastguard Worker NULL,
2713*7c568831SAndroid Build Coastguard Worker getDoc(0),
2714*7c568831SAndroid Build Coastguard Worker getStr(0),
2715*7c568831SAndroid Build Coastguard Worker getAttr(1));
2716*7c568831SAndroid Build Coastguard Worker endOp();
2717*7c568831SAndroid Build Coastguard Worker break;
2718*7c568831SAndroid Build Coastguard Worker
2719*7c568831SAndroid Build Coastguard Worker case OP_XML_ADD_ID_SAFE: {
2720*7c568831SAndroid Build Coastguard Worker int res;
2721*7c568831SAndroid Build Coastguard Worker
2722*7c568831SAndroid Build Coastguard Worker startOp("xmlAddIDSafe");
2723*7c568831SAndroid Build Coastguard Worker res = xmlAddIDSafe(
2724*7c568831SAndroid Build Coastguard Worker getAttr(0),
2725*7c568831SAndroid Build Coastguard Worker getStr(0));
2726*7c568831SAndroid Build Coastguard Worker oomReport = (res < 0);
2727*7c568831SAndroid Build Coastguard Worker endOp();
2728*7c568831SAndroid Build Coastguard Worker break;
2729*7c568831SAndroid Build Coastguard Worker }
2730*7c568831SAndroid Build Coastguard Worker
2731*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_ID:
2732*7c568831SAndroid Build Coastguard Worker startOp("xmlGetID");
2733*7c568831SAndroid Build Coastguard Worker incNodeIdx();
2734*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) xmlGetID(
2735*7c568831SAndroid Build Coastguard Worker getDoc(1),
2736*7c568831SAndroid Build Coastguard Worker getStr(0)));
2737*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2738*7c568831SAndroid Build Coastguard Worker break;
2739*7c568831SAndroid Build Coastguard Worker
2740*7c568831SAndroid Build Coastguard Worker case OP_XML_IS_ID: {
2741*7c568831SAndroid Build Coastguard Worker int res;
2742*7c568831SAndroid Build Coastguard Worker
2743*7c568831SAndroid Build Coastguard Worker startOp("xmlIsID");
2744*7c568831SAndroid Build Coastguard Worker res = xmlIsID(
2745*7c568831SAndroid Build Coastguard Worker getDoc(2),
2746*7c568831SAndroid Build Coastguard Worker getNode(1),
2747*7c568831SAndroid Build Coastguard Worker getAttr(0));
2748*7c568831SAndroid Build Coastguard Worker oomReport = (res < 0);
2749*7c568831SAndroid Build Coastguard Worker endOp();
2750*7c568831SAndroid Build Coastguard Worker break;
2751*7c568831SAndroid Build Coastguard Worker }
2752*7c568831SAndroid Build Coastguard Worker
2753*7c568831SAndroid Build Coastguard Worker case OP_XML_REMOVE_ID:
2754*7c568831SAndroid Build Coastguard Worker startOp("xmlRemoveID");
2755*7c568831SAndroid Build Coastguard Worker xmlRemoveID(
2756*7c568831SAndroid Build Coastguard Worker getDoc(1),
2757*7c568831SAndroid Build Coastguard Worker getAttr(0));
2758*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2759*7c568831SAndroid Build Coastguard Worker endOp();
2760*7c568831SAndroid Build Coastguard Worker break;
2761*7c568831SAndroid Build Coastguard Worker
2762*7c568831SAndroid Build Coastguard Worker case OP_XML_ADD_REF: {
2763*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
2764*7c568831SAndroid Build Coastguard Worker xmlAttrPtr attr;
2765*7c568831SAndroid Build Coastguard Worker xmlRefPtr ref;
2766*7c568831SAndroid Build Coastguard Worker const xmlChar *value;
2767*7c568831SAndroid Build Coastguard Worker
2768*7c568831SAndroid Build Coastguard Worker startOp("xmlAddRef");
2769*7c568831SAndroid Build Coastguard Worker ref = xmlAddRef(
2770*7c568831SAndroid Build Coastguard Worker NULL,
2771*7c568831SAndroid Build Coastguard Worker doc = getDoc(0),
2772*7c568831SAndroid Build Coastguard Worker value = getStr(0),
2773*7c568831SAndroid Build Coastguard Worker attr = getAttr(1));
2774*7c568831SAndroid Build Coastguard Worker oomReport =
2775*7c568831SAndroid Build Coastguard Worker (doc != NULL &&
2776*7c568831SAndroid Build Coastguard Worker value != NULL &&
2777*7c568831SAndroid Build Coastguard Worker attr != NULL &&
2778*7c568831SAndroid Build Coastguard Worker ref == NULL);
2779*7c568831SAndroid Build Coastguard Worker endOp();
2780*7c568831SAndroid Build Coastguard Worker break;
2781*7c568831SAndroid Build Coastguard Worker }
2782*7c568831SAndroid Build Coastguard Worker
2783*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_REFS:
2784*7c568831SAndroid Build Coastguard Worker startOp("xmlGetRefs");
2785*7c568831SAndroid Build Coastguard Worker xmlGetRefs(
2786*7c568831SAndroid Build Coastguard Worker getDoc(1),
2787*7c568831SAndroid Build Coastguard Worker getStr(0));
2788*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2789*7c568831SAndroid Build Coastguard Worker endOp();
2790*7c568831SAndroid Build Coastguard Worker break;
2791*7c568831SAndroid Build Coastguard Worker
2792*7c568831SAndroid Build Coastguard Worker case OP_XML_IS_REF:
2793*7c568831SAndroid Build Coastguard Worker startOp("xmlIsRef");
2794*7c568831SAndroid Build Coastguard Worker xmlIsRef(
2795*7c568831SAndroid Build Coastguard Worker getDoc(2),
2796*7c568831SAndroid Build Coastguard Worker getNode(1),
2797*7c568831SAndroid Build Coastguard Worker getAttr(0));
2798*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2799*7c568831SAndroid Build Coastguard Worker endOp();
2800*7c568831SAndroid Build Coastguard Worker break;
2801*7c568831SAndroid Build Coastguard Worker
2802*7c568831SAndroid Build Coastguard Worker case OP_XML_REMOVE_REF: {
2803*7c568831SAndroid Build Coastguard Worker int res;
2804*7c568831SAndroid Build Coastguard Worker
2805*7c568831SAndroid Build Coastguard Worker startOp("xmlRemoveRef");
2806*7c568831SAndroid Build Coastguard Worker res = xmlRemoveRef(
2807*7c568831SAndroid Build Coastguard Worker getDoc(1),
2808*7c568831SAndroid Build Coastguard Worker getAttr(0));
2809*7c568831SAndroid Build Coastguard Worker if (res == 0)
2810*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2811*7c568831SAndroid Build Coastguard Worker endOp();
2812*7c568831SAndroid Build Coastguard Worker break;
2813*7c568831SAndroid Build Coastguard Worker }
2814*7c568831SAndroid Build Coastguard Worker
2815*7c568831SAndroid Build Coastguard Worker case OP_XML_NEW_ENTITY: {
2816*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
2817*7c568831SAndroid Build Coastguard Worker xmlEntityPtr ent;
2818*7c568831SAndroid Build Coastguard Worker
2819*7c568831SAndroid Build Coastguard Worker startOp("xmlNewEntity");
2820*7c568831SAndroid Build Coastguard Worker incNodeIdx();
2821*7c568831SAndroid Build Coastguard Worker ent = xmlNewEntity(
2822*7c568831SAndroid Build Coastguard Worker doc = getDoc(1),
2823*7c568831SAndroid Build Coastguard Worker getStr(0),
2824*7c568831SAndroid Build Coastguard Worker getInt(0),
2825*7c568831SAndroid Build Coastguard Worker getStr(1),
2826*7c568831SAndroid Build Coastguard Worker getStr(2),
2827*7c568831SAndroid Build Coastguard Worker getStr(3));
2828*7c568831SAndroid Build Coastguard Worker if (ent != NULL)
2829*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2830*7c568831SAndroid Build Coastguard Worker if (doc == NULL || doc->intSubset == NULL) {
2831*7c568831SAndroid Build Coastguard Worker xmlFreeEntity(ent);
2832*7c568831SAndroid Build Coastguard Worker ent = NULL;
2833*7c568831SAndroid Build Coastguard Worker }
2834*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) ent);
2835*7c568831SAndroid Build Coastguard Worker break;
2836*7c568831SAndroid Build Coastguard Worker }
2837*7c568831SAndroid Build Coastguard Worker
2838*7c568831SAndroid Build Coastguard Worker case OP_XML_ADD_ENTITY: {
2839*7c568831SAndroid Build Coastguard Worker xmlEntityPtr ent;
2840*7c568831SAndroid Build Coastguard Worker int res;
2841*7c568831SAndroid Build Coastguard Worker
2842*7c568831SAndroid Build Coastguard Worker startOp("xmlAddEntity");
2843*7c568831SAndroid Build Coastguard Worker incNodeIdx();
2844*7c568831SAndroid Build Coastguard Worker res = xmlAddEntity(
2845*7c568831SAndroid Build Coastguard Worker getDoc(1),
2846*7c568831SAndroid Build Coastguard Worker getInt(0),
2847*7c568831SAndroid Build Coastguard Worker getStr(0),
2848*7c568831SAndroid Build Coastguard Worker getInt(1),
2849*7c568831SAndroid Build Coastguard Worker getStr(1),
2850*7c568831SAndroid Build Coastguard Worker getStr(2),
2851*7c568831SAndroid Build Coastguard Worker getStr(3),
2852*7c568831SAndroid Build Coastguard Worker &ent);
2853*7c568831SAndroid Build Coastguard Worker oomReport = (res == XML_ERR_NO_MEMORY);
2854*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) ent);
2855*7c568831SAndroid Build Coastguard Worker break;
2856*7c568831SAndroid Build Coastguard Worker }
2857*7c568831SAndroid Build Coastguard Worker
2858*7c568831SAndroid Build Coastguard Worker case OP_XML_ADD_DOC_ENTITY: {
2859*7c568831SAndroid Build Coastguard Worker xmlEntityPtr ent;
2860*7c568831SAndroid Build Coastguard Worker
2861*7c568831SAndroid Build Coastguard Worker startOp("xmlAddDocEntity");
2862*7c568831SAndroid Build Coastguard Worker incNodeIdx();
2863*7c568831SAndroid Build Coastguard Worker ent = xmlAddDocEntity(
2864*7c568831SAndroid Build Coastguard Worker getDoc(1),
2865*7c568831SAndroid Build Coastguard Worker getStr(0),
2866*7c568831SAndroid Build Coastguard Worker getInt(1),
2867*7c568831SAndroid Build Coastguard Worker getStr(1),
2868*7c568831SAndroid Build Coastguard Worker getStr(2),
2869*7c568831SAndroid Build Coastguard Worker getStr(3));
2870*7c568831SAndroid Build Coastguard Worker if (ent != NULL)
2871*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2872*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) ent);
2873*7c568831SAndroid Build Coastguard Worker break;
2874*7c568831SAndroid Build Coastguard Worker }
2875*7c568831SAndroid Build Coastguard Worker
2876*7c568831SAndroid Build Coastguard Worker case OP_XML_ADD_DTD_ENTITY: {
2877*7c568831SAndroid Build Coastguard Worker xmlEntityPtr ent;
2878*7c568831SAndroid Build Coastguard Worker
2879*7c568831SAndroid Build Coastguard Worker startOp("xmlAddDtdEntity");
2880*7c568831SAndroid Build Coastguard Worker incNodeIdx();
2881*7c568831SAndroid Build Coastguard Worker ent = xmlAddDtdEntity(
2882*7c568831SAndroid Build Coastguard Worker getDoc(1),
2883*7c568831SAndroid Build Coastguard Worker getStr(0),
2884*7c568831SAndroid Build Coastguard Worker getInt(1),
2885*7c568831SAndroid Build Coastguard Worker getStr(1),
2886*7c568831SAndroid Build Coastguard Worker getStr(2),
2887*7c568831SAndroid Build Coastguard Worker getStr(3));
2888*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) ent);
2889*7c568831SAndroid Build Coastguard Worker break;
2890*7c568831SAndroid Build Coastguard Worker }
2891*7c568831SAndroid Build Coastguard Worker
2892*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_PREDEFINED_ENTITY:
2893*7c568831SAndroid Build Coastguard Worker startOp("xmlGetPredefinedEntity");
2894*7c568831SAndroid Build Coastguard Worker incNodeIdx();
2895*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) xmlGetPredefinedEntity(
2896*7c568831SAndroid Build Coastguard Worker getStr(0)));
2897*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2898*7c568831SAndroid Build Coastguard Worker break;
2899*7c568831SAndroid Build Coastguard Worker
2900*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_DOC_ENTITY:
2901*7c568831SAndroid Build Coastguard Worker startOp("xmlGetDocEntity");
2902*7c568831SAndroid Build Coastguard Worker incNodeIdx();
2903*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) xmlGetDocEntity(
2904*7c568831SAndroid Build Coastguard Worker getDoc(1),
2905*7c568831SAndroid Build Coastguard Worker getStr(0)));
2906*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2907*7c568831SAndroid Build Coastguard Worker break;
2908*7c568831SAndroid Build Coastguard Worker
2909*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_DTD_ENTITY:
2910*7c568831SAndroid Build Coastguard Worker startOp("xmlGetDtdEntity");
2911*7c568831SAndroid Build Coastguard Worker incNodeIdx();
2912*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) xmlGetDtdEntity(
2913*7c568831SAndroid Build Coastguard Worker getDoc(1),
2914*7c568831SAndroid Build Coastguard Worker getStr(0)));
2915*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2916*7c568831SAndroid Build Coastguard Worker break;
2917*7c568831SAndroid Build Coastguard Worker
2918*7c568831SAndroid Build Coastguard Worker case OP_XML_GET_PARAMETER_ENTITY:
2919*7c568831SAndroid Build Coastguard Worker startOp("xmlGetParameterEntity");
2920*7c568831SAndroid Build Coastguard Worker incNodeIdx();
2921*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) xmlGetParameterEntity(
2922*7c568831SAndroid Build Coastguard Worker getDoc(1),
2923*7c568831SAndroid Build Coastguard Worker getStr(0)));
2924*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2925*7c568831SAndroid Build Coastguard Worker break;
2926*7c568831SAndroid Build Coastguard Worker
2927*7c568831SAndroid Build Coastguard Worker case OP_XML_ENCODE_ENTITIES_REENTRANT: {
2928*7c568831SAndroid Build Coastguard Worker const xmlChar *string;
2929*7c568831SAndroid Build Coastguard Worker xmlChar *encoded;
2930*7c568831SAndroid Build Coastguard Worker
2931*7c568831SAndroid Build Coastguard Worker startOp("xmlEncodeEntitiesReentrant");
2932*7c568831SAndroid Build Coastguard Worker incStrIdx();
2933*7c568831SAndroid Build Coastguard Worker encoded = xmlEncodeEntitiesReentrant(
2934*7c568831SAndroid Build Coastguard Worker getDoc(0),
2935*7c568831SAndroid Build Coastguard Worker string = getStr(1));
2936*7c568831SAndroid Build Coastguard Worker oomReport = (string != NULL && encoded == NULL);
2937*7c568831SAndroid Build Coastguard Worker moveStr(0, encoded);
2938*7c568831SAndroid Build Coastguard Worker endOp();
2939*7c568831SAndroid Build Coastguard Worker break;
2940*7c568831SAndroid Build Coastguard Worker }
2941*7c568831SAndroid Build Coastguard Worker
2942*7c568831SAndroid Build Coastguard Worker case OP_XML_ENCODE_SPECIAL_CHARS: {
2943*7c568831SAndroid Build Coastguard Worker const xmlChar *string;
2944*7c568831SAndroid Build Coastguard Worker xmlChar *encoded;
2945*7c568831SAndroid Build Coastguard Worker
2946*7c568831SAndroid Build Coastguard Worker startOp("xmlEncodespecialChars");
2947*7c568831SAndroid Build Coastguard Worker incStrIdx();
2948*7c568831SAndroid Build Coastguard Worker encoded = xmlEncodeSpecialChars(
2949*7c568831SAndroid Build Coastguard Worker getDoc(0),
2950*7c568831SAndroid Build Coastguard Worker string = getStr(1));
2951*7c568831SAndroid Build Coastguard Worker oomReport = (string != NULL && encoded == NULL);
2952*7c568831SAndroid Build Coastguard Worker moveStr(0, encoded);
2953*7c568831SAndroid Build Coastguard Worker endOp();
2954*7c568831SAndroid Build Coastguard Worker break;
2955*7c568831SAndroid Build Coastguard Worker }
2956*7c568831SAndroid Build Coastguard Worker
2957*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
2958*7c568831SAndroid Build Coastguard Worker case OP_HTML_NEW_DOC: {
2959*7c568831SAndroid Build Coastguard Worker htmlDocPtr doc;
2960*7c568831SAndroid Build Coastguard Worker
2961*7c568831SAndroid Build Coastguard Worker startOp("htmlNewDoc");
2962*7c568831SAndroid Build Coastguard Worker incNodeIdx();
2963*7c568831SAndroid Build Coastguard Worker doc = htmlNewDoc(
2964*7c568831SAndroid Build Coastguard Worker getStr(0),
2965*7c568831SAndroid Build Coastguard Worker getStr(1));
2966*7c568831SAndroid Build Coastguard Worker oomReport = (doc == NULL);
2967*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) doc);
2968*7c568831SAndroid Build Coastguard Worker break;
2969*7c568831SAndroid Build Coastguard Worker }
2970*7c568831SAndroid Build Coastguard Worker
2971*7c568831SAndroid Build Coastguard Worker case OP_HTML_NEW_DOC_NO_DTD: {
2972*7c568831SAndroid Build Coastguard Worker htmlDocPtr doc;
2973*7c568831SAndroid Build Coastguard Worker
2974*7c568831SAndroid Build Coastguard Worker startOp("htmlNewDocNoDtD");
2975*7c568831SAndroid Build Coastguard Worker incNodeIdx();
2976*7c568831SAndroid Build Coastguard Worker doc = htmlNewDocNoDtD(
2977*7c568831SAndroid Build Coastguard Worker getStr(0),
2978*7c568831SAndroid Build Coastguard Worker getStr(1));
2979*7c568831SAndroid Build Coastguard Worker oomReport = (doc == NULL);
2980*7c568831SAndroid Build Coastguard Worker setNode(0, (xmlNodePtr) doc);
2981*7c568831SAndroid Build Coastguard Worker break;
2982*7c568831SAndroid Build Coastguard Worker }
2983*7c568831SAndroid Build Coastguard Worker
2984*7c568831SAndroid Build Coastguard Worker case OP_HTML_GET_META_ENCODING: {
2985*7c568831SAndroid Build Coastguard Worker const xmlChar *encoding;
2986*7c568831SAndroid Build Coastguard Worker
2987*7c568831SAndroid Build Coastguard Worker startOp("htmlGetMetaEncoding");
2988*7c568831SAndroid Build Coastguard Worker incStrIdx();
2989*7c568831SAndroid Build Coastguard Worker encoding = htmlGetMetaEncoding(getDoc(0));
2990*7c568831SAndroid Build Coastguard Worker if (encoding != NULL)
2991*7c568831SAndroid Build Coastguard Worker oomReport = 0;
2992*7c568831SAndroid Build Coastguard Worker copyStr(0, encoding);
2993*7c568831SAndroid Build Coastguard Worker break;
2994*7c568831SAndroid Build Coastguard Worker }
2995*7c568831SAndroid Build Coastguard Worker
2996*7c568831SAndroid Build Coastguard Worker case OP_HTML_SET_META_ENCODING:
2997*7c568831SAndroid Build Coastguard Worker /* TODO (can destroy inner text) */
2998*7c568831SAndroid Build Coastguard Worker break;
2999*7c568831SAndroid Build Coastguard Worker
3000*7c568831SAndroid Build Coastguard Worker case OP_HTML_IS_BOOLEAN_ATTR:
3001*7c568831SAndroid Build Coastguard Worker startOp("htmlIsBooleanAttr");
3002*7c568831SAndroid Build Coastguard Worker htmlIsBooleanAttr(getStr(0));
3003*7c568831SAndroid Build Coastguard Worker oomReport = 0;
3004*7c568831SAndroid Build Coastguard Worker endOp();
3005*7c568831SAndroid Build Coastguard Worker break;
3006*7c568831SAndroid Build Coastguard Worker #endif
3007*7c568831SAndroid Build Coastguard Worker
3008*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_VALID_ENABLED
3009*7c568831SAndroid Build Coastguard Worker case OP_VALIDATE: {
3010*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
3011*7c568831SAndroid Build Coastguard Worker int type;
3012*7c568831SAndroid Build Coastguard Worker int res = 1;
3013*7c568831SAndroid Build Coastguard Worker
3014*7c568831SAndroid Build Coastguard Worker startOp("validate");
3015*7c568831SAndroid Build Coastguard Worker incIntIdx();
3016*7c568831SAndroid Build Coastguard Worker node = getNode(0);
3017*7c568831SAndroid Build Coastguard Worker type = node ? node->type : 0;
3018*7c568831SAndroid Build Coastguard Worker xmlValidCtxtPtr vctxt = xmlNewValidCtxt();
3019*7c568831SAndroid Build Coastguard Worker xmlFuzzResetMallocFailed();
3020*7c568831SAndroid Build Coastguard Worker
3021*7c568831SAndroid Build Coastguard Worker switch (type) {
3022*7c568831SAndroid Build Coastguard Worker case XML_DOCUMENT_NODE:
3023*7c568831SAndroid Build Coastguard Worker case XML_HTML_DOCUMENT_NODE:
3024*7c568831SAndroid Build Coastguard Worker res = xmlValidateDocument(vctxt, (xmlDocPtr) node);
3025*7c568831SAndroid Build Coastguard Worker break;
3026*7c568831SAndroid Build Coastguard Worker case XML_ELEMENT_DECL:
3027*7c568831SAndroid Build Coastguard Worker res = xmlValidateElementDecl(vctxt, node->doc,
3028*7c568831SAndroid Build Coastguard Worker (xmlElementPtr) node);
3029*7c568831SAndroid Build Coastguard Worker break;
3030*7c568831SAndroid Build Coastguard Worker case XML_ATTRIBUTE_DECL:
3031*7c568831SAndroid Build Coastguard Worker res = xmlValidateAttributeDecl(vctxt, node->doc,
3032*7c568831SAndroid Build Coastguard Worker (xmlAttributePtr) node);
3033*7c568831SAndroid Build Coastguard Worker break;
3034*7c568831SAndroid Build Coastguard Worker case XML_ELEMENT_NODE:
3035*7c568831SAndroid Build Coastguard Worker res = xmlValidateElement(vctxt, node->doc, node);
3036*7c568831SAndroid Build Coastguard Worker break;
3037*7c568831SAndroid Build Coastguard Worker default:
3038*7c568831SAndroid Build Coastguard Worker break;
3039*7c568831SAndroid Build Coastguard Worker }
3040*7c568831SAndroid Build Coastguard Worker
3041*7c568831SAndroid Build Coastguard Worker if (res != 0)
3042*7c568831SAndroid Build Coastguard Worker oomReport = 0;
3043*7c568831SAndroid Build Coastguard Worker xmlFreeValidCtxt(vctxt);
3044*7c568831SAndroid Build Coastguard Worker setInt(0, res);
3045*7c568831SAndroid Build Coastguard Worker endOp();
3046*7c568831SAndroid Build Coastguard Worker break;
3047*7c568831SAndroid Build Coastguard Worker }
3048*7c568831SAndroid Build Coastguard Worker
3049*7c568831SAndroid Build Coastguard Worker case OP_XML_VALIDATE_DTD: {
3050*7c568831SAndroid Build Coastguard Worker xmlValidCtxtPtr vctxt;
3051*7c568831SAndroid Build Coastguard Worker int res;
3052*7c568831SAndroid Build Coastguard Worker
3053*7c568831SAndroid Build Coastguard Worker startOp("xmlValidateDtd");
3054*7c568831SAndroid Build Coastguard Worker incIntIdx();
3055*7c568831SAndroid Build Coastguard Worker vctxt = xmlNewValidCtxt();
3056*7c568831SAndroid Build Coastguard Worker res = xmlValidateDtd(
3057*7c568831SAndroid Build Coastguard Worker vctxt,
3058*7c568831SAndroid Build Coastguard Worker getDoc(0),
3059*7c568831SAndroid Build Coastguard Worker getDtd(1));
3060*7c568831SAndroid Build Coastguard Worker if (res != 0)
3061*7c568831SAndroid Build Coastguard Worker oomReport = 0;
3062*7c568831SAndroid Build Coastguard Worker xmlFreeValidCtxt(vctxt);
3063*7c568831SAndroid Build Coastguard Worker setInt(0, res);
3064*7c568831SAndroid Build Coastguard Worker endOp();
3065*7c568831SAndroid Build Coastguard Worker break;
3066*7c568831SAndroid Build Coastguard Worker }
3067*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_VALID_ENABLED */
3068*7c568831SAndroid Build Coastguard Worker
3069*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_OUTPUT_ENABLED
3070*7c568831SAndroid Build Coastguard Worker case OP_XML_DOC_DUMP_MEMORY:
3071*7c568831SAndroid Build Coastguard Worker case OP_XML_DOC_DUMP_MEMORY_ENC:
3072*7c568831SAndroid Build Coastguard Worker case OP_XML_DOC_DUMP_FORMAT_MEMORY:
3073*7c568831SAndroid Build Coastguard Worker case OP_XML_DOC_DUMP_FORMAT_MEMORY_ENC:
3074*7c568831SAndroid Build Coastguard Worker case OP_HTML_DOC_DUMP_MEMORY:
3075*7c568831SAndroid Build Coastguard Worker case OP_HTML_DOC_DUMP_MEMORY_FORMAT: {
3076*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
3077*7c568831SAndroid Build Coastguard Worker xmlChar *out = NULL;
3078*7c568831SAndroid Build Coastguard Worker int outSize = 0;
3079*7c568831SAndroid Build Coastguard Worker
3080*7c568831SAndroid Build Coastguard Worker switch (op) {
3081*7c568831SAndroid Build Coastguard Worker case OP_XML_DOC_DUMP_MEMORY:
3082*7c568831SAndroid Build Coastguard Worker startOp("xmlDocDumpMemory"); break;
3083*7c568831SAndroid Build Coastguard Worker case OP_XML_DOC_DUMP_MEMORY_ENC:
3084*7c568831SAndroid Build Coastguard Worker startOp("xmlDocDumpMemoryEnc"); break;
3085*7c568831SAndroid Build Coastguard Worker case OP_XML_DOC_DUMP_FORMAT_MEMORY:
3086*7c568831SAndroid Build Coastguard Worker startOp("xmlDocDumpFormatMemory"); break;
3087*7c568831SAndroid Build Coastguard Worker case OP_XML_DOC_DUMP_FORMAT_MEMORY_ENC:
3088*7c568831SAndroid Build Coastguard Worker startOp("xmlDocDumpFormatMemoryEnc"); break;
3089*7c568831SAndroid Build Coastguard Worker case OP_HTML_DOC_DUMP_MEMORY:
3090*7c568831SAndroid Build Coastguard Worker startOp("htmlDocDumpMemory"); break;
3091*7c568831SAndroid Build Coastguard Worker case OP_HTML_DOC_DUMP_MEMORY_FORMAT:
3092*7c568831SAndroid Build Coastguard Worker startOp("htmlDocDumpMemoryFormat"); break;
3093*7c568831SAndroid Build Coastguard Worker }
3094*7c568831SAndroid Build Coastguard Worker
3095*7c568831SAndroid Build Coastguard Worker incStrIdx();
3096*7c568831SAndroid Build Coastguard Worker doc = getDoc(0);
3097*7c568831SAndroid Build Coastguard Worker
3098*7c568831SAndroid Build Coastguard Worker switch (op) {
3099*7c568831SAndroid Build Coastguard Worker case OP_XML_DOC_DUMP_MEMORY:
3100*7c568831SAndroid Build Coastguard Worker xmlDocDumpMemory(doc, &out, &outSize);
3101*7c568831SAndroid Build Coastguard Worker break;
3102*7c568831SAndroid Build Coastguard Worker case OP_XML_DOC_DUMP_MEMORY_ENC:
3103*7c568831SAndroid Build Coastguard Worker xmlDocDumpMemoryEnc(doc, &out, &outSize,
3104*7c568831SAndroid Build Coastguard Worker (const char *) getStr(1));
3105*7c568831SAndroid Build Coastguard Worker break;
3106*7c568831SAndroid Build Coastguard Worker case OP_XML_DOC_DUMP_FORMAT_MEMORY:
3107*7c568831SAndroid Build Coastguard Worker xmlDocDumpFormatMemory(doc, &out, &outSize,
3108*7c568831SAndroid Build Coastguard Worker getInt(0));
3109*7c568831SAndroid Build Coastguard Worker break;
3110*7c568831SAndroid Build Coastguard Worker case OP_XML_DOC_DUMP_FORMAT_MEMORY_ENC:
3111*7c568831SAndroid Build Coastguard Worker xmlDocDumpFormatMemoryEnc(doc, &out, &outSize,
3112*7c568831SAndroid Build Coastguard Worker (const char *) getStr(1),
3113*7c568831SAndroid Build Coastguard Worker getInt(0));
3114*7c568831SAndroid Build Coastguard Worker break;
3115*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
3116*7c568831SAndroid Build Coastguard Worker case OP_HTML_DOC_DUMP_MEMORY:
3117*7c568831SAndroid Build Coastguard Worker htmlDocDumpMemory(doc, &out, &outSize);
3118*7c568831SAndroid Build Coastguard Worker break;
3119*7c568831SAndroid Build Coastguard Worker case OP_HTML_DOC_DUMP_MEMORY_FORMAT:
3120*7c568831SAndroid Build Coastguard Worker htmlDocDumpMemoryFormat(doc, &out, &outSize,
3121*7c568831SAndroid Build Coastguard Worker getInt(0));
3122*7c568831SAndroid Build Coastguard Worker break;
3123*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_HTML_ENABLED */
3124*7c568831SAndroid Build Coastguard Worker }
3125*7c568831SAndroid Build Coastguard Worker
3126*7c568831SAndroid Build Coastguard Worker /* Could be an unknown encoding */
3127*7c568831SAndroid Build Coastguard Worker if (out != NULL)
3128*7c568831SAndroid Build Coastguard Worker oomReport = 0;
3129*7c568831SAndroid Build Coastguard Worker moveStr(0, out);
3130*7c568831SAndroid Build Coastguard Worker endOp();
3131*7c568831SAndroid Build Coastguard Worker break;
3132*7c568831SAndroid Build Coastguard Worker }
3133*7c568831SAndroid Build Coastguard Worker
3134*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_DUMP:
3135*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_BUF_GET_CONTENT:
3136*7c568831SAndroid Build Coastguard Worker case OP_XML_ATTR_SERIALIZE_TXT_CONTENT:
3137*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_ELEMENT_DECL:
3138*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_ELEMENT_TABLE:
3139*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_ATTRIBUTE_DECL:
3140*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_ATTRIBUTE_TABLE:
3141*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_ENTITY_DECL:
3142*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_ENTITIES_TABLE:
3143*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_NOTATION_DECL:
3144*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_NOTATION_TABLE:
3145*7c568831SAndroid Build Coastguard Worker case OP_HTML_NODE_DUMP: {
3146*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
3147*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
3148*7c568831SAndroid Build Coastguard Worker xmlBufferPtr buffer;
3149*7c568831SAndroid Build Coastguard Worker xmlChar *dump;
3150*7c568831SAndroid Build Coastguard Worker int level, format, res;
3151*7c568831SAndroid Build Coastguard Worker
3152*7c568831SAndroid Build Coastguard Worker switch (op) {
3153*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_DUMP:
3154*7c568831SAndroid Build Coastguard Worker startOp("xmlNodeDump"); break;
3155*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_BUF_GET_CONTENT:
3156*7c568831SAndroid Build Coastguard Worker startOp("xmlNodeBufGetContent"); break;
3157*7c568831SAndroid Build Coastguard Worker case OP_XML_ATTR_SERIALIZE_TXT_CONTENT:
3158*7c568831SAndroid Build Coastguard Worker startOp("xmlAttrSerializeTxtContent"); break;
3159*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_ELEMENT_DECL:
3160*7c568831SAndroid Build Coastguard Worker startOp("xmlDumpElementDecl"); break;
3161*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_ELEMENT_TABLE:
3162*7c568831SAndroid Build Coastguard Worker startOp("xmlDumpElementTable"); break;
3163*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_ATTRIBUTE_DECL:
3164*7c568831SAndroid Build Coastguard Worker startOp("xmlDumpAttributeDecl"); break;
3165*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_ATTRIBUTE_TABLE:
3166*7c568831SAndroid Build Coastguard Worker startOp("xmlDumpAttributeTable"); break;
3167*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_ENTITY_DECL:
3168*7c568831SAndroid Build Coastguard Worker startOp("xmlDumpEntityDecl"); break;
3169*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_ENTITIES_TABLE:
3170*7c568831SAndroid Build Coastguard Worker startOp("xmlDumpEntitiesTable"); break;
3171*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_NOTATION_DECL:
3172*7c568831SAndroid Build Coastguard Worker startOp("xmlDumpNotationDecl"); break;
3173*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_NOTATION_TABLE:
3174*7c568831SAndroid Build Coastguard Worker startOp("xmlDumpNotationTable"); break;
3175*7c568831SAndroid Build Coastguard Worker case OP_HTML_NODE_DUMP:
3176*7c568831SAndroid Build Coastguard Worker startOp("htmlNodeDump"); break;
3177*7c568831SAndroid Build Coastguard Worker }
3178*7c568831SAndroid Build Coastguard Worker
3179*7c568831SAndroid Build Coastguard Worker incStrIdx();
3180*7c568831SAndroid Build Coastguard Worker buffer = xmlBufferCreate();
3181*7c568831SAndroid Build Coastguard Worker xmlFuzzResetMallocFailed();
3182*7c568831SAndroid Build Coastguard Worker node = getNode(0);
3183*7c568831SAndroid Build Coastguard Worker doc = node ? node->doc : NULL;
3184*7c568831SAndroid Build Coastguard Worker level = getInt(0);
3185*7c568831SAndroid Build Coastguard Worker format = getInt(0);
3186*7c568831SAndroid Build Coastguard Worker res = 0;
3187*7c568831SAndroid Build Coastguard Worker
3188*7c568831SAndroid Build Coastguard Worker switch (op) {
3189*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_DUMP:
3190*7c568831SAndroid Build Coastguard Worker res = xmlNodeDump(buffer, doc, node, level, format);
3191*7c568831SAndroid Build Coastguard Worker break;
3192*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_BUF_GET_CONTENT:
3193*7c568831SAndroid Build Coastguard Worker res = xmlNodeBufGetContent(buffer, node);
3194*7c568831SAndroid Build Coastguard Worker break;
3195*7c568831SAndroid Build Coastguard Worker case OP_XML_ATTR_SERIALIZE_TXT_CONTENT:
3196*7c568831SAndroid Build Coastguard Worker if (node != NULL && node->type != XML_ATTRIBUTE_NODE)
3197*7c568831SAndroid Build Coastguard Worker node = NULL;
3198*7c568831SAndroid Build Coastguard Worker xmlAttrSerializeTxtContent(
3199*7c568831SAndroid Build Coastguard Worker buffer, doc,
3200*7c568831SAndroid Build Coastguard Worker (xmlAttrPtr) node,
3201*7c568831SAndroid Build Coastguard Worker getStr(1));
3202*7c568831SAndroid Build Coastguard Worker break;
3203*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_ELEMENT_DECL:
3204*7c568831SAndroid Build Coastguard Worker if (node != NULL && node->type != XML_ELEMENT_DECL)
3205*7c568831SAndroid Build Coastguard Worker node = NULL;
3206*7c568831SAndroid Build Coastguard Worker xmlDumpElementDecl(buffer, (xmlElementPtr) node);
3207*7c568831SAndroid Build Coastguard Worker break;
3208*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_ATTRIBUTE_DECL:
3209*7c568831SAndroid Build Coastguard Worker if (node != NULL && node->type != XML_ATTRIBUTE_DECL)
3210*7c568831SAndroid Build Coastguard Worker node = NULL;
3211*7c568831SAndroid Build Coastguard Worker xmlDumpAttributeDecl(buffer, (xmlAttributePtr) node);
3212*7c568831SAndroid Build Coastguard Worker break;
3213*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_NOTATION_DECL:
3214*7c568831SAndroid Build Coastguard Worker /* TODO */
3215*7c568831SAndroid Build Coastguard Worker break;
3216*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_ENTITY_DECL:
3217*7c568831SAndroid Build Coastguard Worker if (node != NULL && node->type != XML_ENTITY_DECL)
3218*7c568831SAndroid Build Coastguard Worker node = NULL;
3219*7c568831SAndroid Build Coastguard Worker xmlDumpEntityDecl(buffer, (xmlEntityPtr) node);
3220*7c568831SAndroid Build Coastguard Worker break;
3221*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_ELEMENT_TABLE: {
3222*7c568831SAndroid Build Coastguard Worker xmlElementTablePtr table;
3223*7c568831SAndroid Build Coastguard Worker
3224*7c568831SAndroid Build Coastguard Worker table = node != NULL && node->type == XML_DTD_NODE ?
3225*7c568831SAndroid Build Coastguard Worker ((xmlDtdPtr) node)->elements :
3226*7c568831SAndroid Build Coastguard Worker NULL;
3227*7c568831SAndroid Build Coastguard Worker xmlDumpElementTable(buffer, table);
3228*7c568831SAndroid Build Coastguard Worker break;
3229*7c568831SAndroid Build Coastguard Worker }
3230*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_ATTRIBUTE_TABLE: {
3231*7c568831SAndroid Build Coastguard Worker xmlAttributeTablePtr table;
3232*7c568831SAndroid Build Coastguard Worker
3233*7c568831SAndroid Build Coastguard Worker table = node != NULL && node->type == XML_DTD_NODE ?
3234*7c568831SAndroid Build Coastguard Worker ((xmlDtdPtr) node)->attributes :
3235*7c568831SAndroid Build Coastguard Worker NULL;
3236*7c568831SAndroid Build Coastguard Worker xmlDumpAttributeTable(buffer, table);
3237*7c568831SAndroid Build Coastguard Worker break;
3238*7c568831SAndroid Build Coastguard Worker }
3239*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_NOTATION_TABLE: {
3240*7c568831SAndroid Build Coastguard Worker xmlNotationTablePtr table;
3241*7c568831SAndroid Build Coastguard Worker
3242*7c568831SAndroid Build Coastguard Worker table = node != NULL && node->type == XML_DTD_NODE ?
3243*7c568831SAndroid Build Coastguard Worker ((xmlDtdPtr) node)->notations :
3244*7c568831SAndroid Build Coastguard Worker NULL;
3245*7c568831SAndroid Build Coastguard Worker xmlDumpNotationTable(buffer, table);
3246*7c568831SAndroid Build Coastguard Worker break;
3247*7c568831SAndroid Build Coastguard Worker }
3248*7c568831SAndroid Build Coastguard Worker case OP_XML_DUMP_ENTITIES_TABLE: {
3249*7c568831SAndroid Build Coastguard Worker xmlEntitiesTablePtr table;
3250*7c568831SAndroid Build Coastguard Worker
3251*7c568831SAndroid Build Coastguard Worker table = node != NULL && node->type == XML_DTD_NODE ?
3252*7c568831SAndroid Build Coastguard Worker ((xmlDtdPtr) node)->entities :
3253*7c568831SAndroid Build Coastguard Worker NULL;
3254*7c568831SAndroid Build Coastguard Worker xmlDumpEntitiesTable(buffer, table);
3255*7c568831SAndroid Build Coastguard Worker break;
3256*7c568831SAndroid Build Coastguard Worker }
3257*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
3258*7c568831SAndroid Build Coastguard Worker case OP_HTML_NODE_DUMP:
3259*7c568831SAndroid Build Coastguard Worker res = htmlNodeDump(buffer, doc, node);
3260*7c568831SAndroid Build Coastguard Worker break;
3261*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_HTML_ENABLED */
3262*7c568831SAndroid Build Coastguard Worker }
3263*7c568831SAndroid Build Coastguard Worker
3264*7c568831SAndroid Build Coastguard Worker dump = xmlBufferDetach(buffer);
3265*7c568831SAndroid Build Coastguard Worker if (res == 0 && dump != NULL)
3266*7c568831SAndroid Build Coastguard Worker oomReport = 0;
3267*7c568831SAndroid Build Coastguard Worker moveStr(0, dump);
3268*7c568831SAndroid Build Coastguard Worker xmlBufferFree(buffer);
3269*7c568831SAndroid Build Coastguard Worker endOp();
3270*7c568831SAndroid Build Coastguard Worker break;
3271*7c568831SAndroid Build Coastguard Worker }
3272*7c568831SAndroid Build Coastguard Worker
3273*7c568831SAndroid Build Coastguard Worker case OP_XML_SAVE_FILE_TO:
3274*7c568831SAndroid Build Coastguard Worker case OP_XML_SAVE_FORMAT_FILE_TO:
3275*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_DUMP_OUTPUT:
3276*7c568831SAndroid Build Coastguard Worker case OP_HTML_DOC_CONTENT_DUMP_OUTPUT:
3277*7c568831SAndroid Build Coastguard Worker case OP_HTML_DOC_CONTENT_DUMP_FORMAT_OUTPUT:
3278*7c568831SAndroid Build Coastguard Worker case OP_HTML_NODE_DUMP_OUTPUT:
3279*7c568831SAndroid Build Coastguard Worker case OP_HTML_NODE_DUMP_FORMAT_OUTPUT: {
3280*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
3281*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
3282*7c568831SAndroid Build Coastguard Worker xmlOutputBufferPtr output;
3283*7c568831SAndroid Build Coastguard Worker const char *encoding;
3284*7c568831SAndroid Build Coastguard Worker int level, format, argsOk, res, closed;
3285*7c568831SAndroid Build Coastguard Worker
3286*7c568831SAndroid Build Coastguard Worker switch (op) {
3287*7c568831SAndroid Build Coastguard Worker case OP_XML_SAVE_FILE_TO:
3288*7c568831SAndroid Build Coastguard Worker startOp("xmlSaveFileTo"); break;
3289*7c568831SAndroid Build Coastguard Worker case OP_XML_SAVE_FORMAT_FILE_TO:
3290*7c568831SAndroid Build Coastguard Worker startOp("xmlSaveFormatFileTo"); break;
3291*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_DUMP_OUTPUT:
3292*7c568831SAndroid Build Coastguard Worker startOp("xmlNodeDumpOutput"); break;
3293*7c568831SAndroid Build Coastguard Worker case OP_HTML_DOC_CONTENT_DUMP_OUTPUT:
3294*7c568831SAndroid Build Coastguard Worker startOp("htmlDocContentDumpOutput"); break;
3295*7c568831SAndroid Build Coastguard Worker case OP_HTML_DOC_CONTENT_DUMP_FORMAT_OUTPUT:
3296*7c568831SAndroid Build Coastguard Worker startOp("htmlDocContentDumpFormatOutput"); break;
3297*7c568831SAndroid Build Coastguard Worker case OP_HTML_NODE_DUMP_OUTPUT:
3298*7c568831SAndroid Build Coastguard Worker startOp("htmlNodeDumpOutput"); break;
3299*7c568831SAndroid Build Coastguard Worker case OP_HTML_NODE_DUMP_FORMAT_OUTPUT:
3300*7c568831SAndroid Build Coastguard Worker startOp("htmlNodeDumpFormatOutput"); break;
3301*7c568831SAndroid Build Coastguard Worker }
3302*7c568831SAndroid Build Coastguard Worker
3303*7c568831SAndroid Build Coastguard Worker incStrIdx();
3304*7c568831SAndroid Build Coastguard Worker output = xmlAllocOutputBuffer(NULL);
3305*7c568831SAndroid Build Coastguard Worker xmlFuzzResetMallocFailed();
3306*7c568831SAndroid Build Coastguard Worker node = getNode(0);
3307*7c568831SAndroid Build Coastguard Worker doc = node ? node->doc : NULL;
3308*7c568831SAndroid Build Coastguard Worker encoding = (const char *) getStr(1);
3309*7c568831SAndroid Build Coastguard Worker level = getInt(0);
3310*7c568831SAndroid Build Coastguard Worker format = getInt(0);
3311*7c568831SAndroid Build Coastguard Worker argsOk = (output != NULL);
3312*7c568831SAndroid Build Coastguard Worker res = 0;
3313*7c568831SAndroid Build Coastguard Worker closed = 0;
3314*7c568831SAndroid Build Coastguard Worker
3315*7c568831SAndroid Build Coastguard Worker switch (op) {
3316*7c568831SAndroid Build Coastguard Worker case OP_XML_SAVE_FILE_TO:
3317*7c568831SAndroid Build Coastguard Worker argsOk &= (doc != NULL);
3318*7c568831SAndroid Build Coastguard Worker res = xmlSaveFileTo(output, doc, encoding);
3319*7c568831SAndroid Build Coastguard Worker closed = 1;
3320*7c568831SAndroid Build Coastguard Worker break;
3321*7c568831SAndroid Build Coastguard Worker case OP_XML_SAVE_FORMAT_FILE_TO:
3322*7c568831SAndroid Build Coastguard Worker argsOk &= (doc != NULL);
3323*7c568831SAndroid Build Coastguard Worker res = xmlSaveFormatFileTo(output, doc, encoding, format);
3324*7c568831SAndroid Build Coastguard Worker closed = 1;
3325*7c568831SAndroid Build Coastguard Worker break;
3326*7c568831SAndroid Build Coastguard Worker case OP_XML_NODE_DUMP_OUTPUT:
3327*7c568831SAndroid Build Coastguard Worker argsOk &= (node != NULL);
3328*7c568831SAndroid Build Coastguard Worker xmlNodeDumpOutput(output, doc, node, level, format,
3329*7c568831SAndroid Build Coastguard Worker encoding);
3330*7c568831SAndroid Build Coastguard Worker break;
3331*7c568831SAndroid Build Coastguard Worker #ifdef LIBXML_HTML_ENABLED
3332*7c568831SAndroid Build Coastguard Worker case OP_HTML_DOC_CONTENT_DUMP_OUTPUT:
3333*7c568831SAndroid Build Coastguard Worker argsOk &= (doc != NULL);
3334*7c568831SAndroid Build Coastguard Worker htmlDocContentDumpOutput(output, doc, encoding);
3335*7c568831SAndroid Build Coastguard Worker break;
3336*7c568831SAndroid Build Coastguard Worker case OP_HTML_DOC_CONTENT_DUMP_FORMAT_OUTPUT:
3337*7c568831SAndroid Build Coastguard Worker argsOk &= (doc != NULL);
3338*7c568831SAndroid Build Coastguard Worker htmlDocContentDumpFormatOutput(output, doc, encoding,
3339*7c568831SAndroid Build Coastguard Worker format);
3340*7c568831SAndroid Build Coastguard Worker break;
3341*7c568831SAndroid Build Coastguard Worker case OP_HTML_NODE_DUMP_OUTPUT:
3342*7c568831SAndroid Build Coastguard Worker argsOk &= (node != NULL);
3343*7c568831SAndroid Build Coastguard Worker htmlNodeDumpOutput(output, doc, node, encoding);
3344*7c568831SAndroid Build Coastguard Worker break;
3345*7c568831SAndroid Build Coastguard Worker case OP_HTML_NODE_DUMP_FORMAT_OUTPUT:
3346*7c568831SAndroid Build Coastguard Worker argsOk &= (node != NULL);
3347*7c568831SAndroid Build Coastguard Worker htmlNodeDumpFormatOutput(output, doc, node, encoding,
3348*7c568831SAndroid Build Coastguard Worker format);
3349*7c568831SAndroid Build Coastguard Worker break;
3350*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_HTML_ENABLED */
3351*7c568831SAndroid Build Coastguard Worker }
3352*7c568831SAndroid Build Coastguard Worker
3353*7c568831SAndroid Build Coastguard Worker if (closed) {
3354*7c568831SAndroid Build Coastguard Worker if (res >= 0)
3355*7c568831SAndroid Build Coastguard Worker oomReport = 0;
3356*7c568831SAndroid Build Coastguard Worker moveStr(0, NULL);
3357*7c568831SAndroid Build Coastguard Worker } else {
3358*7c568831SAndroid Build Coastguard Worker oomReport =
3359*7c568831SAndroid Build Coastguard Worker (output != NULL &&
3360*7c568831SAndroid Build Coastguard Worker output->error == XML_ERR_NO_MEMORY);
3361*7c568831SAndroid Build Coastguard Worker if (argsOk && !output->error)
3362*7c568831SAndroid Build Coastguard Worker copyStr(0, xmlBufContent(output->buffer));
3363*7c568831SAndroid Build Coastguard Worker else
3364*7c568831SAndroid Build Coastguard Worker moveStr(0, NULL);
3365*7c568831SAndroid Build Coastguard Worker xmlOutputBufferClose(output);
3366*7c568831SAndroid Build Coastguard Worker }
3367*7c568831SAndroid Build Coastguard Worker endOp();
3368*7c568831SAndroid Build Coastguard Worker break;
3369*7c568831SAndroid Build Coastguard Worker }
3370*7c568831SAndroid Build Coastguard Worker #endif /* LIBXML_OUTPUT_ENABLED */
3371*7c568831SAndroid Build Coastguard Worker
3372*7c568831SAndroid Build Coastguard Worker case OP_XML_DOM_WRAP_RECONCILE_NAMESPACES: {
3373*7c568831SAndroid Build Coastguard Worker xmlNodePtr node;
3374*7c568831SAndroid Build Coastguard Worker int res;
3375*7c568831SAndroid Build Coastguard Worker
3376*7c568831SAndroid Build Coastguard Worker startOp("xmlDOMWrapReconcileNamespaces");
3377*7c568831SAndroid Build Coastguard Worker res = xmlDOMWrapReconcileNamespaces(
3378*7c568831SAndroid Build Coastguard Worker NULL,
3379*7c568831SAndroid Build Coastguard Worker node = getNode(0),
3380*7c568831SAndroid Build Coastguard Worker getInt(0));
3381*7c568831SAndroid Build Coastguard Worker oomReport =
3382*7c568831SAndroid Build Coastguard Worker (node != NULL &&
3383*7c568831SAndroid Build Coastguard Worker node->doc != NULL &&
3384*7c568831SAndroid Build Coastguard Worker node->type == XML_ELEMENT_NODE &&
3385*7c568831SAndroid Build Coastguard Worker res < 0);
3386*7c568831SAndroid Build Coastguard Worker endOp();
3387*7c568831SAndroid Build Coastguard Worker break;
3388*7c568831SAndroid Build Coastguard Worker }
3389*7c568831SAndroid Build Coastguard Worker
3390*7c568831SAndroid Build Coastguard Worker case OP_XML_DOM_WRAP_ADOPT_NODE: {
3391*7c568831SAndroid Build Coastguard Worker xmlDOMWrapCtxtPtr ctxt;
3392*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc, destDoc, oldDoc;
3393*7c568831SAndroid Build Coastguard Worker xmlNodePtr node, destParent, oldParent;
3394*7c568831SAndroid Build Coastguard Worker int res;
3395*7c568831SAndroid Build Coastguard Worker
3396*7c568831SAndroid Build Coastguard Worker startOp("xmlDOMWrapAdoptNode");
3397*7c568831SAndroid Build Coastguard Worker ctxt = xmlDOMWrapNewCtxt();
3398*7c568831SAndroid Build Coastguard Worker doc = getDoc(0);
3399*7c568831SAndroid Build Coastguard Worker node = getNode(1);
3400*7c568831SAndroid Build Coastguard Worker destDoc = getDoc(2);
3401*7c568831SAndroid Build Coastguard Worker destParent = getNode(3);
3402*7c568831SAndroid Build Coastguard Worker
3403*7c568831SAndroid Build Coastguard Worker if (!isValidChild(destParent, node))
3404*7c568831SAndroid Build Coastguard Worker destParent = NULL;
3405*7c568831SAndroid Build Coastguard Worker
3406*7c568831SAndroid Build Coastguard Worker oldParent = node ? node->parent : NULL;
3407*7c568831SAndroid Build Coastguard Worker oldDoc = node ? node->doc : NULL;
3408*7c568831SAndroid Build Coastguard Worker
3409*7c568831SAndroid Build Coastguard Worker res = xmlDOMWrapAdoptNode(
3410*7c568831SAndroid Build Coastguard Worker ctxt,
3411*7c568831SAndroid Build Coastguard Worker doc,
3412*7c568831SAndroid Build Coastguard Worker node,
3413*7c568831SAndroid Build Coastguard Worker destDoc,
3414*7c568831SAndroid Build Coastguard Worker destParent,
3415*7c568831SAndroid Build Coastguard Worker getInt(0));
3416*7c568831SAndroid Build Coastguard Worker if (ctxt == NULL)
3417*7c568831SAndroid Build Coastguard Worker oomReport = 1;
3418*7c568831SAndroid Build Coastguard Worker else if (res == 0)
3419*7c568831SAndroid Build Coastguard Worker oomReport = 0;
3420*7c568831SAndroid Build Coastguard Worker
3421*7c568831SAndroid Build Coastguard Worker if (node != NULL) {
3422*7c568831SAndroid Build Coastguard Worker /* Node can reference destParent's namespaces */
3423*7c568831SAndroid Build Coastguard Worker if (destParent != NULL &&
3424*7c568831SAndroid Build Coastguard Worker node->parent == NULL &&
3425*7c568831SAndroid Build Coastguard Worker node->doc == destParent->doc) {
3426*7c568831SAndroid Build Coastguard Worker if (node->type == XML_ATTRIBUTE_NODE) {
3427*7c568831SAndroid Build Coastguard Worker xmlNodePtr prop;
3428*7c568831SAndroid Build Coastguard Worker
3429*7c568831SAndroid Build Coastguard Worker /* Insert without removing duplicates */
3430*7c568831SAndroid Build Coastguard Worker node->parent = destParent;
3431*7c568831SAndroid Build Coastguard Worker prop = (xmlNodePtr) destParent->properties;
3432*7c568831SAndroid Build Coastguard Worker node->next = prop;
3433*7c568831SAndroid Build Coastguard Worker if (prop != NULL)
3434*7c568831SAndroid Build Coastguard Worker prop->prev = node;
3435*7c568831SAndroid Build Coastguard Worker destParent->properties = (xmlAttrPtr) node;
3436*7c568831SAndroid Build Coastguard Worker } else if (node->type != XML_TEXT_NODE) {
3437*7c568831SAndroid Build Coastguard Worker xmlAddChild(destParent, node);
3438*7c568831SAndroid Build Coastguard Worker }
3439*7c568831SAndroid Build Coastguard Worker }
3440*7c568831SAndroid Build Coastguard Worker
3441*7c568831SAndroid Build Coastguard Worker /* Node can be unlinked and moved to a new document. */
3442*7c568831SAndroid Build Coastguard Worker if (oldParent != NULL && node->parent != oldParent)
3443*7c568831SAndroid Build Coastguard Worker dropNode(oldParent);
3444*7c568831SAndroid Build Coastguard Worker else if (node->doc != oldDoc)
3445*7c568831SAndroid Build Coastguard Worker dropNode((xmlNodePtr) oldDoc);
3446*7c568831SAndroid Build Coastguard Worker }
3447*7c568831SAndroid Build Coastguard Worker
3448*7c568831SAndroid Build Coastguard Worker xmlDOMWrapFreeCtxt(ctxt);
3449*7c568831SAndroid Build Coastguard Worker endOp();
3450*7c568831SAndroid Build Coastguard Worker break;
3451*7c568831SAndroid Build Coastguard Worker }
3452*7c568831SAndroid Build Coastguard Worker
3453*7c568831SAndroid Build Coastguard Worker case OP_XML_DOM_WRAP_REMOVE_NODE: {
3454*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc;
3455*7c568831SAndroid Build Coastguard Worker xmlNodePtr node, oldParent;
3456*7c568831SAndroid Build Coastguard Worker int res;
3457*7c568831SAndroid Build Coastguard Worker
3458*7c568831SAndroid Build Coastguard Worker startOp("xmlDOMWrapRemoveNode");
3459*7c568831SAndroid Build Coastguard Worker doc = getDoc(0);
3460*7c568831SAndroid Build Coastguard Worker node = getNode(1);
3461*7c568831SAndroid Build Coastguard Worker oldParent = node ? node->parent : NULL;
3462*7c568831SAndroid Build Coastguard Worker res = xmlDOMWrapRemoveNode(NULL, doc, node, 0);
3463*7c568831SAndroid Build Coastguard Worker oomReport =
3464*7c568831SAndroid Build Coastguard Worker (node != NULL &&
3465*7c568831SAndroid Build Coastguard Worker doc != NULL &&
3466*7c568831SAndroid Build Coastguard Worker node->doc == doc &&
3467*7c568831SAndroid Build Coastguard Worker res < 0);
3468*7c568831SAndroid Build Coastguard Worker if (node != NULL && node->parent != oldParent) {
3469*7c568831SAndroid Build Coastguard Worker if (fixNs(node) < 0)
3470*7c568831SAndroid Build Coastguard Worker oomReport = 1;
3471*7c568831SAndroid Build Coastguard Worker dropNode(oldParent);
3472*7c568831SAndroid Build Coastguard Worker }
3473*7c568831SAndroid Build Coastguard Worker endOp();
3474*7c568831SAndroid Build Coastguard Worker break;
3475*7c568831SAndroid Build Coastguard Worker }
3476*7c568831SAndroid Build Coastguard Worker
3477*7c568831SAndroid Build Coastguard Worker case OP_XML_DOM_WRAP_CLONE_NODE: {
3478*7c568831SAndroid Build Coastguard Worker xmlDOMWrapCtxtPtr ctxt;
3479*7c568831SAndroid Build Coastguard Worker xmlDocPtr doc, destDoc;
3480*7c568831SAndroid Build Coastguard Worker xmlNodePtr node, destParent, copy = NULL;
3481*7c568831SAndroid Build Coastguard Worker int res;
3482*7c568831SAndroid Build Coastguard Worker
3483*7c568831SAndroid Build Coastguard Worker startOp("xmlDOMWrapCloneNode");
3484*7c568831SAndroid Build Coastguard Worker incNodeIdx();
3485*7c568831SAndroid Build Coastguard Worker ctxt = xmlDOMWrapNewCtxt();
3486*7c568831SAndroid Build Coastguard Worker doc = getDoc(1);
3487*7c568831SAndroid Build Coastguard Worker node = getNode(2);
3488*7c568831SAndroid Build Coastguard Worker destDoc = getDoc(3);
3489*7c568831SAndroid Build Coastguard Worker destParent = getNode(4);
3490*7c568831SAndroid Build Coastguard Worker
3491*7c568831SAndroid Build Coastguard Worker if (destParent != NULL &&
3492*7c568831SAndroid Build Coastguard Worker node != NULL &&
3493*7c568831SAndroid Build Coastguard Worker !isValidChildType(destParent, node->type))
3494*7c568831SAndroid Build Coastguard Worker destParent = NULL;
3495*7c568831SAndroid Build Coastguard Worker
3496*7c568831SAndroid Build Coastguard Worker /* xmlDOMWrapCloneNode returns a garbage node on error. */
3497*7c568831SAndroid Build Coastguard Worker res = xmlDOMWrapCloneNode(
3498*7c568831SAndroid Build Coastguard Worker ctxt,
3499*7c568831SAndroid Build Coastguard Worker doc,
3500*7c568831SAndroid Build Coastguard Worker node,
3501*7c568831SAndroid Build Coastguard Worker ©,
3502*7c568831SAndroid Build Coastguard Worker destDoc,
3503*7c568831SAndroid Build Coastguard Worker destParent,
3504*7c568831SAndroid Build Coastguard Worker getInt(0),
3505*7c568831SAndroid Build Coastguard Worker 0);
3506*7c568831SAndroid Build Coastguard Worker if (ctxt == NULL)
3507*7c568831SAndroid Build Coastguard Worker oomReport = 1;
3508*7c568831SAndroid Build Coastguard Worker else if (res == 0)
3509*7c568831SAndroid Build Coastguard Worker oomReport = 0;
3510*7c568831SAndroid Build Coastguard Worker copy = checkCopy(copy);
3511*7c568831SAndroid Build Coastguard Worker
3512*7c568831SAndroid Build Coastguard Worker /* Copy can reference destParent's namespaces */
3513*7c568831SAndroid Build Coastguard Worker if (destParent != NULL && copy != NULL) {
3514*7c568831SAndroid Build Coastguard Worker if (copy->type == XML_ATTRIBUTE_NODE) {
3515*7c568831SAndroid Build Coastguard Worker xmlNodePtr prop;
3516*7c568831SAndroid Build Coastguard Worker
3517*7c568831SAndroid Build Coastguard Worker /* Insert without removing duplicates */
3518*7c568831SAndroid Build Coastguard Worker copy->parent = destParent;
3519*7c568831SAndroid Build Coastguard Worker prop = (xmlNodePtr) destParent->properties;
3520*7c568831SAndroid Build Coastguard Worker copy->next = prop;
3521*7c568831SAndroid Build Coastguard Worker if (prop != NULL)
3522*7c568831SAndroid Build Coastguard Worker prop->prev = copy;
3523*7c568831SAndroid Build Coastguard Worker destParent->properties = (xmlAttrPtr) copy;
3524*7c568831SAndroid Build Coastguard Worker } else if (copy->type != XML_TEXT_NODE) {
3525*7c568831SAndroid Build Coastguard Worker xmlAddChild(destParent, copy);
3526*7c568831SAndroid Build Coastguard Worker }
3527*7c568831SAndroid Build Coastguard Worker }
3528*7c568831SAndroid Build Coastguard Worker
3529*7c568831SAndroid Build Coastguard Worker xmlDOMWrapFreeCtxt(ctxt);
3530*7c568831SAndroid Build Coastguard Worker setNode(0, copy);
3531*7c568831SAndroid Build Coastguard Worker break;
3532*7c568831SAndroid Build Coastguard Worker }
3533*7c568831SAndroid Build Coastguard Worker
3534*7c568831SAndroid Build Coastguard Worker case OP_XML_CHILD_ELEMENT_COUNT:
3535*7c568831SAndroid Build Coastguard Worker startOp("xmlChildElementCount");
3536*7c568831SAndroid Build Coastguard Worker incIntIdx();
3537*7c568831SAndroid Build Coastguard Worker setInt(0, xmlChildElementCount(getNode(0)));
3538*7c568831SAndroid Build Coastguard Worker oomReport = 0;
3539*7c568831SAndroid Build Coastguard Worker break;
3540*7c568831SAndroid Build Coastguard Worker
3541*7c568831SAndroid Build Coastguard Worker case OP_XML_FIRST_ELEMENT_CHILD:
3542*7c568831SAndroid Build Coastguard Worker startOp("xmlFirstElementChild");
3543*7c568831SAndroid Build Coastguard Worker incNodeIdx();
3544*7c568831SAndroid Build Coastguard Worker setNode(0, xmlFirstElementChild(getNode(1)));
3545*7c568831SAndroid Build Coastguard Worker oomReport = 0;
3546*7c568831SAndroid Build Coastguard Worker break;
3547*7c568831SAndroid Build Coastguard Worker
3548*7c568831SAndroid Build Coastguard Worker case OP_XML_LAST_ELEMENT_CHILD:
3549*7c568831SAndroid Build Coastguard Worker startOp("xmlLastElementChild");
3550*7c568831SAndroid Build Coastguard Worker incNodeIdx();
3551*7c568831SAndroid Build Coastguard Worker setNode(0, xmlLastElementChild(getNode(1)));
3552*7c568831SAndroid Build Coastguard Worker oomReport = 0;
3553*7c568831SAndroid Build Coastguard Worker break;
3554*7c568831SAndroid Build Coastguard Worker
3555*7c568831SAndroid Build Coastguard Worker case OP_XML_NEXT_ELEMENT_SIBLING:
3556*7c568831SAndroid Build Coastguard Worker startOp("xmlNextElementSibling");
3557*7c568831SAndroid Build Coastguard Worker incNodeIdx();
3558*7c568831SAndroid Build Coastguard Worker setNode(0, xmlNextElementSibling(getNode(1)));
3559*7c568831SAndroid Build Coastguard Worker oomReport = 0;
3560*7c568831SAndroid Build Coastguard Worker break;
3561*7c568831SAndroid Build Coastguard Worker
3562*7c568831SAndroid Build Coastguard Worker case OP_XML_PREVIOUS_ELEMENT_SIBLING:
3563*7c568831SAndroid Build Coastguard Worker startOp("xmlPreviousElementSibling");
3564*7c568831SAndroid Build Coastguard Worker incNodeIdx();
3565*7c568831SAndroid Build Coastguard Worker setNode(0, xmlPreviousElementSibling(getNode(1)));
3566*7c568831SAndroid Build Coastguard Worker oomReport = 0;
3567*7c568831SAndroid Build Coastguard Worker break;
3568*7c568831SAndroid Build Coastguard Worker
3569*7c568831SAndroid Build Coastguard Worker default:
3570*7c568831SAndroid Build Coastguard Worker break;
3571*7c568831SAndroid Build Coastguard Worker }
3572*7c568831SAndroid Build Coastguard Worker
3573*7c568831SAndroid Build Coastguard Worker xmlFuzzCheckMallocFailure(vars->opName, oomReport);
3574*7c568831SAndroid Build Coastguard Worker }
3575*7c568831SAndroid Build Coastguard Worker
3576*7c568831SAndroid Build Coastguard Worker for (i = 0; i < REG_MAX; i++)
3577*7c568831SAndroid Build Coastguard Worker xmlFree(vars->strings[i]);
3578*7c568831SAndroid Build Coastguard Worker
3579*7c568831SAndroid Build Coastguard Worker for (i = 0; i < REG_MAX; i++) {
3580*7c568831SAndroid Build Coastguard Worker xmlNodePtr node = vars->nodes[i];
3581*7c568831SAndroid Build Coastguard Worker
3582*7c568831SAndroid Build Coastguard Worker vars->nodes[i] = NULL;
3583*7c568831SAndroid Build Coastguard Worker dropNode(node);
3584*7c568831SAndroid Build Coastguard Worker }
3585*7c568831SAndroid Build Coastguard Worker
3586*7c568831SAndroid Build Coastguard Worker xmlFuzzMemSetLimit(0);
3587*7c568831SAndroid Build Coastguard Worker xmlFuzzDataCleanup();
3588*7c568831SAndroid Build Coastguard Worker xmlResetLastError();
3589*7c568831SAndroid Build Coastguard Worker return(0);
3590*7c568831SAndroid Build Coastguard Worker }
3591*7c568831SAndroid Build Coastguard Worker
3592