Coverage Report

Created: 2026-07-16 06:39

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/geos/tests/fuzz/fuzz_geo2.c
Line
Count
Source
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <stdint.h>
4
#include <stdarg.h>
5
#include <string.h>
6
7
#include "geos_c.h"
8
9
static int initialized = 0;
10
FILE * flogOut;
11
12
void
13
4.85k
notice(const char *fmt, ...) {
14
4.85k
    va_list ap;
15
4.85k
    fprintf( flogOut, "NOTICE: ");
16
4.85k
    va_start (ap, fmt);
17
4.85k
    vfprintf( flogOut, fmt, ap);
18
4.85k
    va_end(ap);
19
4.85k
    fprintf( flogOut, "\n" );
20
4.85k
}
21
22
void
23
107k
log_and_exit(const char *fmt, ...) {
24
107k
    va_list ap;
25
107k
    fprintf( flogOut, "ERROR: ");
26
107k
    va_start (ap, fmt);
27
107k
    vfprintf( flogOut, fmt, ap);
28
107k
    va_end(ap);
29
107k
    fprintf( flogOut, "\n" );
30
107k
}
31
32
13.5k
int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
33
13.5k
    if (initialized == 0) {
34
1
        flogOut = fopen("/dev/null", "wb");
35
1
        initGEOS(notice, log_and_exit);
36
1
        initialized = 1;
37
1
    }
38
13.5k
    size_t sep;
39
82.5M
    for (sep = 0; sep < Size; sep ++) {
40
82.5M
        if (Data[sep] == 0) {
41
13.5k
            break;
42
13.5k
        }
43
82.5M
    }
44
13.5k
    if (sep == Size) {
45
9
        return 0;
46
9
    }
47
13.5k
    GEOSGeometry *g1 = GEOSGeomFromWKT(Data);
48
49
13.5k
    if (g1 != NULL) {
50
12.2k
        GEOSGeometry *g2 = GEOSGeomFromWKB_buf(Data+sep+1, Size-sep-1);
51
12.2k
        if (g2 != NULL) {
52
11.4k
            size_t usize;
53
11.4k
            GEOSGeometry *g3 = GEOSIntersection(g1, g2);
54
11.4k
            GEOSGeom_destroy(g3);
55
11.4k
            g3 = GEOSDifference(g1, g2);
56
11.4k
            GEOSGeom_destroy(g3);
57
11.4k
            g3 = GEOSUnion(g1, g2);
58
11.4k
            GEOSGeom_destroy(g3);
59
11.4k
            unsigned char* uptr = GEOSGeomToWKB_buf(g1, &usize);
60
11.4k
            GEOSFree(uptr);
61
11.4k
            GEOSGeom_destroy(g2);
62
11.4k
        }
63
12.2k
        char * r = GEOSGeomToWKT(g1);
64
12.2k
        GEOSFree(r);
65
12.2k
        GEOSGeom_destroy(g1);
66
12.2k
    }
67
13.5k
    return 0;
68
13.5k
}
69