/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 | | |