/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 | 0 | notice(const char *fmt, ...) { |
14 | 0 | va_list ap; |
15 | 0 | fprintf( flogOut, "NOTICE: "); |
16 | 0 | va_start (ap, fmt); |
17 | 0 | vfprintf( flogOut, fmt, ap); |
18 | 0 | va_end(ap); |
19 | 0 | fprintf( flogOut, "\n" ); |
20 | 0 | } |
21 | | |
22 | | void |
23 | 7.37k | log_and_exit(const char *fmt, ...) { |
24 | 7.37k | va_list ap; |
25 | 7.37k | fprintf( flogOut, "ERROR: "); |
26 | 7.37k | va_start (ap, fmt); |
27 | 7.37k | vfprintf( flogOut, fmt, ap); |
28 | 7.37k | va_end(ap); |
29 | 7.37k | fprintf( flogOut, "\n" ); |
30 | 7.37k | } |
31 | | |
32 | 7.58k | int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { |
33 | 7.58k | if (initialized == 0) { |
34 | 1 | flogOut = fopen("/dev/null", "wb"); |
35 | 1 | initGEOS(notice, log_and_exit); |
36 | 1 | initialized = 1; |
37 | 1 | } |
38 | 7.58k | size_t sep; |
39 | 129M | for (sep = 0; sep < Size; sep ++) { |
40 | 129M | if (Data[sep] == 0) { |
41 | 7.58k | break; |
42 | 7.58k | } |
43 | 129M | } |
44 | 7.58k | if (sep == Size) { |
45 | 3 | return 0; |
46 | 3 | } |
47 | 7.58k | GEOSGeometry *g1 = GEOSGeomFromWKT(Data); |
48 | | |
49 | 7.58k | if (g1 != NULL) { |
50 | 6.77k | GEOSGeometry *g2 = GEOSGeomFromWKB_buf(Data+sep, Size-sep); |
51 | 6.77k | if (g2 != NULL) { |
52 | 6.23k | size_t usize; |
53 | 6.23k | GEOSGeometry *g3 = GEOSIntersection(g1, g2); |
54 | 6.23k | GEOSGeom_destroy(g3); |
55 | 6.23k | g3 = GEOSDifference(g1, g2); |
56 | 6.23k | GEOSGeom_destroy(g3); |
57 | 6.23k | g3 = GEOSUnion(g1, g2); |
58 | 6.23k | GEOSGeom_destroy(g3); |
59 | 6.23k | unsigned char* uptr = GEOSGeomToWKB_buf(g1, &usize); |
60 | 6.23k | free(uptr); |
61 | 6.23k | GEOSGeom_destroy(g2); |
62 | 6.23k | } |
63 | 6.77k | char * r = GEOSGeomToWKT(g1); |
64 | 6.77k | free(r); |
65 | 6.77k | GEOSGeom_destroy(g1); |
66 | 6.77k | } |
67 | 7.58k | return 0; |
68 | 7.58k | } |
69 | | |