Coverage Report

Created: 2026-07-16 06:18

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