/src/gdal/fuzzers/ogr_fuzzer.cpp
Line | Count | Source |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Project: GDAL |
4 | | * Purpose: Fuzzer |
5 | | * Author: Even Rouault, even.rouault at spatialys.com |
6 | | * |
7 | | ****************************************************************************** |
8 | | * Copyright (c) 2017, Even Rouault <even.rouault at spatialys.com> |
9 | | * |
10 | | * Permission is hereby granted, free of charge, to any person obtaining a |
11 | | * copy of this software and associated documentation files (the "Software"), |
12 | | * to deal in the Software without restriction, including without limitation |
13 | | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
14 | | * and/or sell copies of the Software, and to permit persons to whom the |
15 | | * Software is furnished to do so, subject to the following conditions: |
16 | | * |
17 | | * The above copyright notice and this permission notice shall be included |
18 | | * in all copies or substantial portions of the Software. |
19 | | * |
20 | | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
21 | | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
22 | | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
23 | | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
24 | | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
25 | | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
26 | | * DEALINGS IN THE SOFTWARE. |
27 | | ****************************************************************************/ |
28 | | |
29 | | #include <stddef.h> |
30 | | #include <stdint.h> |
31 | | |
32 | | #include "ogr_api.h" |
33 | | #include "cpl_conv.h" |
34 | | #include "cpl_error.h" |
35 | | #include "cpl_vsi.h" |
36 | | #include "ogrsf_frmts.h" |
37 | | |
38 | | #ifndef REGISTER_FUNC |
39 | 80 | #define REGISTER_FUNC OGRRegisterAll |
40 | | #ifndef OGR_SKIP |
41 | 80 | #define OGR_SKIP "CAD,DXF" |
42 | | #endif |
43 | | #endif |
44 | | |
45 | | #ifndef EXTENSION |
46 | 25.9k | #define EXTENSION "bin" |
47 | | #endif |
48 | | |
49 | | #ifndef MEM_FILENAME |
50 | 683k | #define MEM_FILENAME "/vsimem/test" |
51 | | #endif |
52 | | |
53 | | #ifndef GDAL_FILENAME |
54 | 227k | #define GDAL_FILENAME MEM_FILENAME |
55 | | #endif |
56 | | |
57 | | extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv); |
58 | | extern "C" int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len); |
59 | | |
60 | | int LLVMFuzzerInitialize(int * /*argc*/, char ***argv) |
61 | 160 | { |
62 | 160 | const char *exe_path = (*argv)[0]; |
63 | 160 | if (CPLGetConfigOption("GDAL_DATA", nullptr) == nullptr) |
64 | 160 | { |
65 | 160 | CPLSetConfigOption("GDAL_DATA", CPLGetPathSafe(exe_path).c_str()); |
66 | 160 | } |
67 | 160 | CPLSetConfigOption("CPL_TMPDIR", "/tmp"); |
68 | 160 | CPLSetConfigOption("DISABLE_OPEN_REAL_NETCDF_FILES", "YES"); |
69 | 160 | CPLSetConfigOption("GDAL_HTTP_TIMEOUT", "1"); |
70 | 160 | CPLSetConfigOption("GDAL_HTTP_CONNECTTIMEOUT", "1"); |
71 | | // To avoid timeouts. See https://github.com/OSGeo/gdal/issues/502 |
72 | 160 | CPLSetConfigOption("DXF_MAX_BSPLINE_CONTROL_POINTS", "100"); |
73 | 160 | CPLSetConfigOption("NAS_INDICATOR", |
74 | 160 | "NAS-Operationen;AAA-Fachschema;aaa.xsd;aaa-suite"); |
75 | 160 | CPLSetConfigOption( |
76 | 160 | "USERNAME", |
77 | 160 | "unknown"); // see GMLASConfiguration::GetBaseCacheDirectory() |
78 | | |
79 | 160 | #ifdef OGR_SKIP |
80 | 160 | CPLSetConfigOption("OGR_SKIP", OGR_SKIP); |
81 | 160 | #endif |
82 | 160 | REGISTER_FUNC(); |
83 | | |
84 | 160 | return 0; |
85 | 160 | } Line | Count | Source | 61 | 80 | { | 62 | 80 | const char *exe_path = (*argv)[0]; | 63 | 80 | if (CPLGetConfigOption("GDAL_DATA", nullptr) == nullptr) | 64 | 80 | { | 65 | 80 | CPLSetConfigOption("GDAL_DATA", CPLGetPathSafe(exe_path).c_str()); | 66 | 80 | } | 67 | 80 | CPLSetConfigOption("CPL_TMPDIR", "/tmp"); | 68 | 80 | CPLSetConfigOption("DISABLE_OPEN_REAL_NETCDF_FILES", "YES"); | 69 | 80 | CPLSetConfigOption("GDAL_HTTP_TIMEOUT", "1"); | 70 | 80 | CPLSetConfigOption("GDAL_HTTP_CONNECTTIMEOUT", "1"); | 71 | | // To avoid timeouts. See https://github.com/OSGeo/gdal/issues/502 | 72 | 80 | CPLSetConfigOption("DXF_MAX_BSPLINE_CONTROL_POINTS", "100"); | 73 | 80 | CPLSetConfigOption("NAS_INDICATOR", | 74 | 80 | "NAS-Operationen;AAA-Fachschema;aaa.xsd;aaa-suite"); | 75 | 80 | CPLSetConfigOption( | 76 | 80 | "USERNAME", | 77 | 80 | "unknown"); // see GMLASConfiguration::GetBaseCacheDirectory() | 78 | | | 79 | 80 | #ifdef OGR_SKIP | 80 | 80 | CPLSetConfigOption("OGR_SKIP", OGR_SKIP); | 81 | 80 | #endif | 82 | 80 | REGISTER_FUNC(); | 83 | | | 84 | 80 | return 0; | 85 | 80 | } |
Line | Count | Source | 61 | 80 | { | 62 | 80 | const char *exe_path = (*argv)[0]; | 63 | 80 | if (CPLGetConfigOption("GDAL_DATA", nullptr) == nullptr) | 64 | 80 | { | 65 | 80 | CPLSetConfigOption("GDAL_DATA", CPLGetPathSafe(exe_path).c_str()); | 66 | 80 | } | 67 | 80 | CPLSetConfigOption("CPL_TMPDIR", "/tmp"); | 68 | 80 | CPLSetConfigOption("DISABLE_OPEN_REAL_NETCDF_FILES", "YES"); | 69 | 80 | CPLSetConfigOption("GDAL_HTTP_TIMEOUT", "1"); | 70 | 80 | CPLSetConfigOption("GDAL_HTTP_CONNECTTIMEOUT", "1"); | 71 | | // To avoid timeouts. See https://github.com/OSGeo/gdal/issues/502 | 72 | 80 | CPLSetConfigOption("DXF_MAX_BSPLINE_CONTROL_POINTS", "100"); | 73 | 80 | CPLSetConfigOption("NAS_INDICATOR", | 74 | 80 | "NAS-Operationen;AAA-Fachschema;aaa.xsd;aaa-suite"); | 75 | 80 | CPLSetConfigOption( | 76 | 80 | "USERNAME", | 77 | 80 | "unknown"); // see GMLASConfiguration::GetBaseCacheDirectory() | 78 | | | 79 | 80 | #ifdef OGR_SKIP | 80 | 80 | CPLSetConfigOption("OGR_SKIP", OGR_SKIP); | 81 | 80 | #endif | 82 | 80 | REGISTER_FUNC(); | 83 | | | 84 | 80 | return 0; | 85 | 80 | } |
|
86 | | |
87 | | int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len) |
88 | 484k | { |
89 | | #ifdef USE_FILESYSTEM |
90 | | char szTempFilename[64]; |
91 | | snprintf(szTempFilename, sizeof(szTempFilename), "/tmp/gdal_fuzzer_%d.%s", |
92 | 25.9k | (int)getpid(), EXTENSION); |
93 | | VSILFILE *fp = VSIFOpenL(szTempFilename, "wb"); |
94 | 25.9k | if (!fp) |
95 | 0 | { |
96 | 0 | fprintf(stderr, "Cannot create %s\n", szTempFilename); |
97 | 0 | return 1; |
98 | 0 | } |
99 | 25.9k | VSIFWriteL(buf, 1, len, fp); |
100 | | #else |
101 | | VSILFILE *fp = VSIFileFromMemBuffer( |
102 | 227k | MEM_FILENAME, reinterpret_cast<GByte *>(const_cast<uint8_t *>(buf)), |
103 | 458k | len, FALSE); |
104 | | #endif |
105 | 25.9k | VSIFCloseL(fp); |
106 | | |
107 | 25.9k | CPLPushErrorHandler(CPLQuietErrorHandler); |
108 | | #ifdef USE_FILESYSTEM |
109 | 25.9k | OGRDataSourceH hDS = OGROpen(szTempFilename, FALSE, nullptr); |
110 | | #elif defined(FOR_OGR_MIRAMON) |
111 | | std::string osVsitarPrefix("/vsitar/"); |
112 | | char **papszFiles = |
113 | | VSIReadDir(std::string(osVsitarPrefix).append(MEM_FILENAME).c_str()); |
114 | | std::string osFileInTar; |
115 | 21.5k | for (int i = 0; papszFiles && papszFiles[i]; ++i) |
116 | 21.5k | { |
117 | 21.5k | if (EQUAL(CPLGetExtensionSafe(papszFiles[i]).c_str(), "pol") || |
118 | 18.9k | EQUAL(CPLGetExtensionSafe(papszFiles[i]).c_str(), "arc") || |
119 | 18.7k | EQUAL(CPLGetExtensionSafe(papszFiles[i]).c_str(), "pnt")) |
120 | 3.05k | { |
121 | 3.05k | osFileInTar = papszFiles[i]; |
122 | 3.05k | break; |
123 | 3.05k | } |
124 | 21.5k | } |
125 | | CSLDestroy(papszFiles); |
126 | | OGRDataSourceH hDS = nullptr; |
127 | 3.09k | if (!osFileInTar.empty()) |
128 | 3.05k | { |
129 | 3.05k | hDS = OGROpen(std::string(osVsitarPrefix) |
130 | 3.05k | .append(MEM_FILENAME) |
131 | 3.05k | .append("/") |
132 | 3.05k | .append(osFileInTar) |
133 | 3.05k | .c_str(), |
134 | 3.05k | FALSE, nullptr); |
135 | 3.05k | } |
136 | | #else |
137 | 455k | OGRDataSourceH hDS = OGROpen(GDAL_FILENAME, FALSE, nullptr); |
138 | | #endif |
139 | 484k | if (hDS) |
140 | 342k | { |
141 | 342k | const int nLayers = OGR_DS_GetLayerCount(hDS); |
142 | 342k | time_t nStartTime = time(nullptr); |
143 | 342k | bool bStop = false; |
144 | 946k | for (int i = 0; !bStop && i < 10 && i < nLayers; i++) |
145 | 604k | { |
146 | 604k | OGRLayerH hLayer = OGR_DS_GetLayer(hDS, i); |
147 | 604k | OGR_L_GetSpatialRef(hLayer); |
148 | 604k | OGR_L_GetGeomType(hLayer); |
149 | 604k | OGR_L_GetFIDColumn(hLayer); |
150 | 604k | OGR_L_GetGeometryColumn(hLayer); |
151 | 604k | OGRFeatureH hFeature; |
152 | 604k | OGRFeatureH hFeaturePrev = nullptr; |
153 | 604k | for (int j = 0; |
154 | 25.6M | j < 1000 && !bStop && |
155 | 25.6M | (hFeature = OGR_L_GetNextFeature(hLayer)) != nullptr; |
156 | 25.0M | j++) |
157 | 25.0M | { |
158 | | // Limit runtime to 20 seconds if features returned are |
159 | | // different. Otherwise this may be a sign of a bug in the |
160 | | // reader and we want the infinite loop to be revealed. |
161 | 25.0M | if (time(nullptr) - nStartTime > 20) |
162 | 64 | { |
163 | 64 | bool bIsSameAsPrevious = |
164 | 64 | (hFeaturePrev != nullptr && |
165 | 64 | OGR_F_Equal(hFeature, hFeaturePrev)); |
166 | 64 | if (!bIsSameAsPrevious) |
167 | 64 | { |
168 | 64 | bStop = true; |
169 | 64 | } |
170 | 64 | } |
171 | 25.0M | if (hFeaturePrev) |
172 | 24.7M | OGR_F_Destroy(hFeaturePrev); |
173 | 25.0M | hFeaturePrev = hFeature; |
174 | 25.0M | } |
175 | 604k | if (hFeaturePrev) |
176 | 329k | OGR_F_Destroy(hFeaturePrev); |
177 | 604k | } |
178 | 342k | OGR_DS_Destroy(hDS); |
179 | 342k | } |
180 | 25.9k | CPLPopErrorHandler(); |
181 | | #ifdef USE_FILESYSTEM |
182 | | VSIUnlink(szTempFilename); |
183 | | #else |
184 | 227k | VSIUnlink(MEM_FILENAME); |
185 | | #endif |
186 | 25.9k | return 0; |
187 | 484k | } Line | Count | Source | 88 | 227k | { | 89 | | #ifdef USE_FILESYSTEM | 90 | | char szTempFilename[64]; | 91 | | snprintf(szTempFilename, sizeof(szTempFilename), "/tmp/gdal_fuzzer_%d.%s", | 92 | | (int)getpid(), EXTENSION); | 93 | | VSILFILE *fp = VSIFOpenL(szTempFilename, "wb"); | 94 | | if (!fp) | 95 | | { | 96 | | fprintf(stderr, "Cannot create %s\n", szTempFilename); | 97 | | return 1; | 98 | | } | 99 | | VSIFWriteL(buf, 1, len, fp); | 100 | | #else | 101 | 227k | VSILFILE *fp = VSIFileFromMemBuffer( | 102 | 227k | MEM_FILENAME, reinterpret_cast<GByte *>(const_cast<uint8_t *>(buf)), | 103 | 227k | len, FALSE); | 104 | 227k | #endif | 105 | 227k | VSIFCloseL(fp); | 106 | | | 107 | 227k | CPLPushErrorHandler(CPLQuietErrorHandler); | 108 | | #ifdef USE_FILESYSTEM | 109 | | OGRDataSourceH hDS = OGROpen(szTempFilename, FALSE, nullptr); | 110 | | #elif defined(FOR_OGR_MIRAMON) | 111 | | std::string osVsitarPrefix("/vsitar/"); | 112 | | char **papszFiles = | 113 | | VSIReadDir(std::string(osVsitarPrefix).append(MEM_FILENAME).c_str()); | 114 | | std::string osFileInTar; | 115 | | for (int i = 0; papszFiles && papszFiles[i]; ++i) | 116 | | { | 117 | | if (EQUAL(CPLGetExtensionSafe(papszFiles[i]).c_str(), "pol") || | 118 | | EQUAL(CPLGetExtensionSafe(papszFiles[i]).c_str(), "arc") || | 119 | | EQUAL(CPLGetExtensionSafe(papszFiles[i]).c_str(), "pnt")) | 120 | | { | 121 | | osFileInTar = papszFiles[i]; | 122 | | break; | 123 | | } | 124 | | } | 125 | | CSLDestroy(papszFiles); | 126 | | OGRDataSourceH hDS = nullptr; | 127 | | if (!osFileInTar.empty()) | 128 | | { | 129 | | hDS = OGROpen(std::string(osVsitarPrefix) | 130 | | .append(MEM_FILENAME) | 131 | | .append("/") | 132 | | .append(osFileInTar) | 133 | | .c_str(), | 134 | | FALSE, nullptr); | 135 | | } | 136 | | #else | 137 | 227k | OGRDataSourceH hDS = OGROpen(GDAL_FILENAME, FALSE, nullptr); | 138 | 227k | #endif | 139 | 227k | if (hDS) | 140 | 162k | { | 141 | 162k | const int nLayers = OGR_DS_GetLayerCount(hDS); | 142 | 162k | time_t nStartTime = time(nullptr); | 143 | 162k | bool bStop = false; | 144 | 449k | for (int i = 0; !bStop && i < 10 && i < nLayers; i++) | 145 | 286k | { | 146 | 286k | OGRLayerH hLayer = OGR_DS_GetLayer(hDS, i); | 147 | 286k | OGR_L_GetSpatialRef(hLayer); | 148 | 286k | OGR_L_GetGeomType(hLayer); | 149 | 286k | OGR_L_GetFIDColumn(hLayer); | 150 | 286k | OGR_L_GetGeometryColumn(hLayer); | 151 | 286k | OGRFeatureH hFeature; | 152 | 286k | OGRFeatureH hFeaturePrev = nullptr; | 153 | 286k | for (int j = 0; | 154 | 12.4M | j < 1000 && !bStop && | 155 | 12.4M | (hFeature = OGR_L_GetNextFeature(hLayer)) != nullptr; | 156 | 12.2M | j++) | 157 | 12.2M | { | 158 | | // Limit runtime to 20 seconds if features returned are | 159 | | // different. Otherwise this may be a sign of a bug in the | 160 | | // reader and we want the infinite loop to be revealed. | 161 | 12.2M | if (time(nullptr) - nStartTime > 20) | 162 | 32 | { | 163 | 32 | bool bIsSameAsPrevious = | 164 | 32 | (hFeaturePrev != nullptr && | 165 | 32 | OGR_F_Equal(hFeature, hFeaturePrev)); | 166 | 32 | if (!bIsSameAsPrevious) | 167 | 32 | { | 168 | 32 | bStop = true; | 169 | 32 | } | 170 | 32 | } | 171 | 12.2M | if (hFeaturePrev) | 172 | 12.0M | OGR_F_Destroy(hFeaturePrev); | 173 | 12.2M | hFeaturePrev = hFeature; | 174 | 12.2M | } | 175 | 286k | if (hFeaturePrev) | 176 | 158k | OGR_F_Destroy(hFeaturePrev); | 177 | 286k | } | 178 | 162k | OGR_DS_Destroy(hDS); | 179 | 162k | } | 180 | 227k | CPLPopErrorHandler(); | 181 | | #ifdef USE_FILESYSTEM | 182 | | VSIUnlink(szTempFilename); | 183 | | #else | 184 | 227k | VSIUnlink(MEM_FILENAME); | 185 | 227k | #endif | 186 | 227k | return 0; | 187 | 227k | } |
Line | Count | Source | 88 | 227k | { | 89 | | #ifdef USE_FILESYSTEM | 90 | | char szTempFilename[64]; | 91 | | snprintf(szTempFilename, sizeof(szTempFilename), "/tmp/gdal_fuzzer_%d.%s", | 92 | | (int)getpid(), EXTENSION); | 93 | | VSILFILE *fp = VSIFOpenL(szTempFilename, "wb"); | 94 | | if (!fp) | 95 | | { | 96 | | fprintf(stderr, "Cannot create %s\n", szTempFilename); | 97 | | return 1; | 98 | | } | 99 | | VSIFWriteL(buf, 1, len, fp); | 100 | | #else | 101 | 227k | VSILFILE *fp = VSIFileFromMemBuffer( | 102 | 227k | MEM_FILENAME, reinterpret_cast<GByte *>(const_cast<uint8_t *>(buf)), | 103 | 227k | len, FALSE); | 104 | 227k | #endif | 105 | 227k | VSIFCloseL(fp); | 106 | | | 107 | 227k | CPLPushErrorHandler(CPLQuietErrorHandler); | 108 | | #ifdef USE_FILESYSTEM | 109 | | OGRDataSourceH hDS = OGROpen(szTempFilename, FALSE, nullptr); | 110 | | #elif defined(FOR_OGR_MIRAMON) | 111 | | std::string osVsitarPrefix("/vsitar/"); | 112 | | char **papszFiles = | 113 | | VSIReadDir(std::string(osVsitarPrefix).append(MEM_FILENAME).c_str()); | 114 | | std::string osFileInTar; | 115 | | for (int i = 0; papszFiles && papszFiles[i]; ++i) | 116 | | { | 117 | | if (EQUAL(CPLGetExtensionSafe(papszFiles[i]).c_str(), "pol") || | 118 | | EQUAL(CPLGetExtensionSafe(papszFiles[i]).c_str(), "arc") || | 119 | | EQUAL(CPLGetExtensionSafe(papszFiles[i]).c_str(), "pnt")) | 120 | | { | 121 | | osFileInTar = papszFiles[i]; | 122 | | break; | 123 | | } | 124 | | } | 125 | | CSLDestroy(papszFiles); | 126 | | OGRDataSourceH hDS = nullptr; | 127 | | if (!osFileInTar.empty()) | 128 | | { | 129 | | hDS = OGROpen(std::string(osVsitarPrefix) | 130 | | .append(MEM_FILENAME) | 131 | | .append("/") | 132 | | .append(osFileInTar) | 133 | | .c_str(), | 134 | | FALSE, nullptr); | 135 | | } | 136 | | #else | 137 | 227k | OGRDataSourceH hDS = OGROpen(GDAL_FILENAME, FALSE, nullptr); | 138 | 227k | #endif | 139 | 227k | if (hDS) | 140 | 162k | { | 141 | 162k | const int nLayers = OGR_DS_GetLayerCount(hDS); | 142 | 162k | time_t nStartTime = time(nullptr); | 143 | 162k | bool bStop = false; | 144 | 449k | for (int i = 0; !bStop && i < 10 && i < nLayers; i++) | 145 | 286k | { | 146 | 286k | OGRLayerH hLayer = OGR_DS_GetLayer(hDS, i); | 147 | 286k | OGR_L_GetSpatialRef(hLayer); | 148 | 286k | OGR_L_GetGeomType(hLayer); | 149 | 286k | OGR_L_GetFIDColumn(hLayer); | 150 | 286k | OGR_L_GetGeometryColumn(hLayer); | 151 | 286k | OGRFeatureH hFeature; | 152 | 286k | OGRFeatureH hFeaturePrev = nullptr; | 153 | 286k | for (int j = 0; | 154 | 12.4M | j < 1000 && !bStop && | 155 | 12.4M | (hFeature = OGR_L_GetNextFeature(hLayer)) != nullptr; | 156 | 12.2M | j++) | 157 | 12.2M | { | 158 | | // Limit runtime to 20 seconds if features returned are | 159 | | // different. Otherwise this may be a sign of a bug in the | 160 | | // reader and we want the infinite loop to be revealed. | 161 | 12.2M | if (time(nullptr) - nStartTime > 20) | 162 | 32 | { | 163 | 32 | bool bIsSameAsPrevious = | 164 | 32 | (hFeaturePrev != nullptr && | 165 | 32 | OGR_F_Equal(hFeature, hFeaturePrev)); | 166 | 32 | if (!bIsSameAsPrevious) | 167 | 32 | { | 168 | 32 | bStop = true; | 169 | 32 | } | 170 | 32 | } | 171 | 12.2M | if (hFeaturePrev) | 172 | 12.0M | OGR_F_Destroy(hFeaturePrev); | 173 | 12.2M | hFeaturePrev = hFeature; | 174 | 12.2M | } | 175 | 286k | if (hFeaturePrev) | 176 | 158k | OGR_F_Destroy(hFeaturePrev); | 177 | 286k | } | 178 | 162k | OGR_DS_Destroy(hDS); | 179 | 162k | } | 180 | 227k | CPLPopErrorHandler(); | 181 | | #ifdef USE_FILESYSTEM | 182 | | VSIUnlink(szTempFilename); | 183 | | #else | 184 | 227k | VSIUnlink(MEM_FILENAME); | 185 | 227k | #endif | 186 | 227k | return 0; | 187 | 227k | } |
Line | Count | Source | 88 | 25.9k | { | 89 | 25.9k | #ifdef USE_FILESYSTEM | 90 | 25.9k | char szTempFilename[64]; | 91 | 25.9k | snprintf(szTempFilename, sizeof(szTempFilename), "/tmp/gdal_fuzzer_%d.%s", | 92 | 25.9k | (int)getpid(), EXTENSION); | 93 | 25.9k | VSILFILE *fp = VSIFOpenL(szTempFilename, "wb"); | 94 | 25.9k | if (!fp) | 95 | 0 | { | 96 | 0 | fprintf(stderr, "Cannot create %s\n", szTempFilename); | 97 | 0 | return 1; | 98 | 0 | } | 99 | 25.9k | VSIFWriteL(buf, 1, len, fp); | 100 | | #else | 101 | | VSILFILE *fp = VSIFileFromMemBuffer( | 102 | | MEM_FILENAME, reinterpret_cast<GByte *>(const_cast<uint8_t *>(buf)), | 103 | | len, FALSE); | 104 | | #endif | 105 | 25.9k | VSIFCloseL(fp); | 106 | | | 107 | 25.9k | CPLPushErrorHandler(CPLQuietErrorHandler); | 108 | 25.9k | #ifdef USE_FILESYSTEM | 109 | 25.9k | OGRDataSourceH hDS = OGROpen(szTempFilename, FALSE, nullptr); | 110 | | #elif defined(FOR_OGR_MIRAMON) | 111 | | std::string osVsitarPrefix("/vsitar/"); | 112 | | char **papszFiles = | 113 | | VSIReadDir(std::string(osVsitarPrefix).append(MEM_FILENAME).c_str()); | 114 | | std::string osFileInTar; | 115 | | for (int i = 0; papszFiles && papszFiles[i]; ++i) | 116 | | { | 117 | | if (EQUAL(CPLGetExtensionSafe(papszFiles[i]).c_str(), "pol") || | 118 | | EQUAL(CPLGetExtensionSafe(papszFiles[i]).c_str(), "arc") || | 119 | | EQUAL(CPLGetExtensionSafe(papszFiles[i]).c_str(), "pnt")) | 120 | | { | 121 | | osFileInTar = papszFiles[i]; | 122 | | break; | 123 | | } | 124 | | } | 125 | | CSLDestroy(papszFiles); | 126 | | OGRDataSourceH hDS = nullptr; | 127 | | if (!osFileInTar.empty()) | 128 | | { | 129 | | hDS = OGROpen(std::string(osVsitarPrefix) | 130 | | .append(MEM_FILENAME) | 131 | | .append("/") | 132 | | .append(osFileInTar) | 133 | | .c_str(), | 134 | | FALSE, nullptr); | 135 | | } | 136 | | #else | 137 | | OGRDataSourceH hDS = OGROpen(GDAL_FILENAME, FALSE, nullptr); | 138 | | #endif | 139 | 25.9k | if (hDS) | 140 | 15.7k | { | 141 | 15.7k | const int nLayers = OGR_DS_GetLayerCount(hDS); | 142 | 15.7k | time_t nStartTime = time(nullptr); | 143 | 15.7k | bool bStop = false; | 144 | 46.4k | for (int i = 0; !bStop && i < 10 && i < nLayers; i++) | 145 | 30.6k | { | 146 | 30.6k | OGRLayerH hLayer = OGR_DS_GetLayer(hDS, i); | 147 | 30.6k | OGR_L_GetSpatialRef(hLayer); | 148 | 30.6k | OGR_L_GetGeomType(hLayer); | 149 | 30.6k | OGR_L_GetFIDColumn(hLayer); | 150 | 30.6k | OGR_L_GetGeometryColumn(hLayer); | 151 | 30.6k | OGRFeatureH hFeature; | 152 | 30.6k | OGRFeatureH hFeaturePrev = nullptr; | 153 | 30.6k | for (int j = 0; | 154 | 654k | j < 1000 && !bStop && | 155 | 654k | (hFeature = OGR_L_GetNextFeature(hLayer)) != nullptr; | 156 | 624k | j++) | 157 | 624k | { | 158 | | // Limit runtime to 20 seconds if features returned are | 159 | | // different. Otherwise this may be a sign of a bug in the | 160 | | // reader and we want the infinite loop to be revealed. | 161 | 624k | if (time(nullptr) - nStartTime > 20) | 162 | 0 | { | 163 | 0 | bool bIsSameAsPrevious = | 164 | 0 | (hFeaturePrev != nullptr && | 165 | 0 | OGR_F_Equal(hFeature, hFeaturePrev)); | 166 | 0 | if (!bIsSameAsPrevious) | 167 | 0 | { | 168 | 0 | bStop = true; | 169 | 0 | } | 170 | 0 | } | 171 | 624k | if (hFeaturePrev) | 172 | 611k | OGR_F_Destroy(hFeaturePrev); | 173 | 624k | hFeaturePrev = hFeature; | 174 | 624k | } | 175 | 30.6k | if (hFeaturePrev) | 176 | 12.4k | OGR_F_Destroy(hFeaturePrev); | 177 | 30.6k | } | 178 | 15.7k | OGR_DS_Destroy(hDS); | 179 | 15.7k | } | 180 | 25.9k | CPLPopErrorHandler(); | 181 | 25.9k | #ifdef USE_FILESYSTEM | 182 | 25.9k | VSIUnlink(szTempFilename); | 183 | | #else | 184 | | VSIUnlink(MEM_FILENAME); | 185 | | #endif | 186 | 25.9k | return 0; | 187 | 25.9k | } |
Line | Count | Source | 88 | 3.09k | { | 89 | | #ifdef USE_FILESYSTEM | 90 | | char szTempFilename[64]; | 91 | | snprintf(szTempFilename, sizeof(szTempFilename), "/tmp/gdal_fuzzer_%d.%s", | 92 | | (int)getpid(), EXTENSION); | 93 | | VSILFILE *fp = VSIFOpenL(szTempFilename, "wb"); | 94 | | if (!fp) | 95 | | { | 96 | | fprintf(stderr, "Cannot create %s\n", szTempFilename); | 97 | | return 1; | 98 | | } | 99 | | VSIFWriteL(buf, 1, len, fp); | 100 | | #else | 101 | 3.09k | VSILFILE *fp = VSIFileFromMemBuffer( | 102 | 3.09k | MEM_FILENAME, reinterpret_cast<GByte *>(const_cast<uint8_t *>(buf)), | 103 | 3.09k | len, FALSE); | 104 | 3.09k | #endif | 105 | 3.09k | VSIFCloseL(fp); | 106 | | | 107 | 3.09k | CPLPushErrorHandler(CPLQuietErrorHandler); | 108 | | #ifdef USE_FILESYSTEM | 109 | | OGRDataSourceH hDS = OGROpen(szTempFilename, FALSE, nullptr); | 110 | | #elif defined(FOR_OGR_MIRAMON) | 111 | | std::string osVsitarPrefix("/vsitar/"); | 112 | 3.09k | char **papszFiles = | 113 | 3.09k | VSIReadDir(std::string(osVsitarPrefix).append(MEM_FILENAME).c_str()); | 114 | 3.09k | std::string osFileInTar; | 115 | 21.5k | for (int i = 0; papszFiles && papszFiles[i]; ++i) | 116 | 21.5k | { | 117 | 21.5k | if (EQUAL(CPLGetExtensionSafe(papszFiles[i]).c_str(), "pol") || | 118 | 18.9k | EQUAL(CPLGetExtensionSafe(papszFiles[i]).c_str(), "arc") || | 119 | 18.7k | EQUAL(CPLGetExtensionSafe(papszFiles[i]).c_str(), "pnt")) | 120 | 3.05k | { | 121 | 3.05k | osFileInTar = papszFiles[i]; | 122 | 3.05k | break; | 123 | 3.05k | } | 124 | 21.5k | } | 125 | 3.09k | CSLDestroy(papszFiles); | 126 | 3.09k | OGRDataSourceH hDS = nullptr; | 127 | 3.09k | if (!osFileInTar.empty()) | 128 | 3.05k | { | 129 | 3.05k | hDS = OGROpen(std::string(osVsitarPrefix) | 130 | 3.05k | .append(MEM_FILENAME) | 131 | 3.05k | .append("/") | 132 | 3.05k | .append(osFileInTar) | 133 | 3.05k | .c_str(), | 134 | 3.05k | FALSE, nullptr); | 135 | 3.05k | } | 136 | | #else | 137 | | OGRDataSourceH hDS = OGROpen(GDAL_FILENAME, FALSE, nullptr); | 138 | | #endif | 139 | 3.09k | if (hDS) | 140 | 586 | { | 141 | 586 | const int nLayers = OGR_DS_GetLayerCount(hDS); | 142 | 586 | time_t nStartTime = time(nullptr); | 143 | 586 | bool bStop = false; | 144 | 1.17k | for (int i = 0; !bStop && i < 10 && i < nLayers; i++) | 145 | 586 | { | 146 | 586 | OGRLayerH hLayer = OGR_DS_GetLayer(hDS, i); | 147 | 586 | OGR_L_GetSpatialRef(hLayer); | 148 | 586 | OGR_L_GetGeomType(hLayer); | 149 | 586 | OGR_L_GetFIDColumn(hLayer); | 150 | 586 | OGR_L_GetGeometryColumn(hLayer); | 151 | 586 | OGRFeatureH hFeature; | 152 | 586 | OGRFeatureH hFeaturePrev = nullptr; | 153 | 586 | for (int j = 0; | 154 | 12.2k | j < 1000 && !bStop && | 155 | 12.2k | (hFeature = OGR_L_GetNextFeature(hLayer)) != nullptr; | 156 | 11.6k | j++) | 157 | 11.6k | { | 158 | | // Limit runtime to 20 seconds if features returned are | 159 | | // different. Otherwise this may be a sign of a bug in the | 160 | | // reader and we want the infinite loop to be revealed. | 161 | 11.6k | if (time(nullptr) - nStartTime > 20) | 162 | 0 | { | 163 | 0 | bool bIsSameAsPrevious = | 164 | 0 | (hFeaturePrev != nullptr && | 165 | 0 | OGR_F_Equal(hFeature, hFeaturePrev)); | 166 | 0 | if (!bIsSameAsPrevious) | 167 | 0 | { | 168 | 0 | bStop = true; | 169 | 0 | } | 170 | 0 | } | 171 | 11.6k | if (hFeaturePrev) | 172 | 11.2k | OGR_F_Destroy(hFeaturePrev); | 173 | 11.6k | hFeaturePrev = hFeature; | 174 | 11.6k | } | 175 | 586 | if (hFeaturePrev) | 176 | 395 | OGR_F_Destroy(hFeaturePrev); | 177 | 586 | } | 178 | 586 | OGR_DS_Destroy(hDS); | 179 | 586 | } | 180 | 3.09k | CPLPopErrorHandler(); | 181 | | #ifdef USE_FILESYSTEM | 182 | | VSIUnlink(szTempFilename); | 183 | | #else | 184 | 3.09k | VSIUnlink(MEM_FILENAME); | 185 | 3.09k | #endif | 186 | 3.09k | return 0; | 187 | 3.09k | } |
|