Coverage Report

Created: 2025-11-11 06:53

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libyang/tests/fuzz/lyd_parse_mem_xml.c
Line
Count
Source
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <stdbool.h>
4
5
#include "libyang.h"
6
7
int LLVMFuzzerTestOneInput(uint8_t const *buf, size_t len)
8
28.9k
{
9
28.9k
    struct ly_ctx *ctx = NULL;
10
28.9k
    static bool log = false;
11
28.9k
    const char *schema_a =
12
28.9k
            "module defs {namespace urn:tests:defs;prefix d;yang-version 1.1;"
13
28.9k
            "identity crypto-alg; identity interface-type; identity ethernet {base interface-type;}"
14
28.9k
            "identity fast-ethernet {base ethernet;}}";
15
28.9k
    const char *schema_b =
16
28.9k
            "module types {namespace urn:tests:types;prefix t;yang-version 1.1; import defs {prefix defs;}"
17
28.9k
            "feature f; identity gigabit-ethernet { base defs:ethernet;}"
18
28.9k
            "container cont {leaf leaftarget {type empty;}"
19
28.9k
                            "list listtarget {key id; max-elements 5;leaf id {type uint8;} leaf value {type string;}}"
20
28.9k
                            "leaf-list leaflisttarget {type uint8; max-elements 5;}}"
21
28.9k
            "list list {key id; leaf id {type string;} leaf value {type string;} leaf-list targets {type string;}}"
22
28.9k
            "list list2 {key \"id value\"; leaf id {type string;} leaf value {type string;}}"
23
28.9k
            "list list_inst {key id; leaf id {type instance-identifier {require-instance true;}} leaf value {type string;}}"
24
28.9k
            "list list_ident {key id; leaf id {type identityref {base defs:interface-type;}} leaf value {type string;}}"
25
28.9k
            "leaf-list leaflisttarget {type string;}"
26
28.9k
            "leaf binary {type binary {length 5 {error-message \"This base64 value must be of length 5.\";}}}"
27
28.9k
            "leaf binary-norestr {type binary;}"
28
28.9k
            "leaf int8 {type int8 {range 10..20;}}"
29
28.9k
            "leaf uint8 {type uint8 {range 150..200;}}"
30
28.9k
            "leaf int16 {type int16 {range -20..-10;}}"
31
28.9k
            "leaf uint16 {type uint16 {range 150..200;}}"
32
28.9k
            "leaf int32 {type int32;}"
33
28.9k
            "leaf uint32 {type uint32;}"
34
28.9k
            "leaf int64 {type int64;}"
35
28.9k
            "leaf uint64 {type uint64;}"
36
28.9k
            "leaf bits {type bits {bit zero; bit one {if-feature f;} bit two;}}"
37
28.9k
            "leaf enums {type enumeration {enum white; enum yellow {if-feature f;}}}"
38
28.9k
            "leaf dec64 {type decimal64 {fraction-digits 1; range 1.5..10;}}"
39
28.9k
            "leaf dec64-norestr {type decimal64 {fraction-digits 18;}}"
40
28.9k
            "leaf str {type string {length 8..10; pattern '[a-z ]*';}}"
41
28.9k
            "leaf str-norestr {type string;}"
42
28.9k
            "leaf str-utf8 {type string{length 2..5; pattern '€*';}}"
43
28.9k
            "leaf bool {type boolean;}"
44
28.9k
            "leaf empty {type empty;}"
45
28.9k
            "leaf ident {type identityref {base defs:interface-type;}}"
46
28.9k
            "leaf inst {type instance-identifier {require-instance true;}}"
47
28.9k
            "leaf inst-noreq {type instance-identifier {require-instance false;}}"
48
28.9k
            "leaf lref {type leafref {path /leaflisttarget; require-instance true;}}"
49
28.9k
            "leaf lref2 {type leafref {path \"../list[id = current()/../str-norestr]/targets\"; require-instance true;}}"
50
28.9k
            "leaf un1 {type union {"
51
28.9k
            "type leafref {path /int8; require-instance true;}"
52
28.9k
            "type union { type identityref {base defs:interface-type;} type instance-identifier {require-instance true;} }"
53
28.9k
            "type string {length 1..20;}}}}";
54
28.9k
    char *data = NULL;
55
28.9k
    struct lyd_node *tree = NULL;
56
28.9k
    LY_ERR err;
57
58
28.9k
    if (!log) {
59
3
        ly_log_options(0);
60
3
        log = true;
61
3
    }
62
63
28.9k
    err = ly_ctx_new(NULL, 0, &ctx);
64
28.9k
    if (err != LY_SUCCESS) {
65
0
        fprintf(stderr, "Failed to create context\n");
66
0
        exit(EXIT_FAILURE);
67
0
    }
68
69
28.9k
    lys_parse_mem(ctx, schema_a, LYS_IN_YANG, NULL);
70
28.9k
    lys_parse_mem(ctx, schema_b, LYS_IN_YANG, NULL);
71
72
28.9k
    data = malloc(len + 1);
73
28.9k
    if (data == NULL) {
74
0
        return 0;
75
0
    }
76
28.9k
    memcpy(data, buf, len);
77
28.9k
    data[len] = 0;
78
79
28.9k
    lyd_parse_data_mem(ctx, data, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree);
80
28.9k
    lyd_free_all(tree);
81
28.9k
    ly_ctx_destroy(ctx);
82
83
28.9k
    free(data);
84
85
28.9k
    return 0;
86
28.9k
}