xref: /aosp_15_r20/external/libxml2/fuzz/api.c (revision 7c5688314b92172186c154356a6374bf7684c3ca)
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                     &copy,
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