/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 | 78 | #define REGISTER_FUNC OGRRegisterAll |
40 | | #ifndef OGR_SKIP |
41 | 78 | #define OGR_SKIP "CAD,DXF" |
42 | | #endif |
43 | | #endif |
44 | | |
45 | | #ifndef EXTENSION |
46 | 21.4k | #define EXTENSION "bin" |
47 | | #endif |
48 | | |
49 | | #ifndef MEM_FILENAME |
50 | 612k | #define MEM_FILENAME "/vsimem/test" |
51 | | #endif |
52 | | |
53 | | #ifndef GDAL_FILENAME |
54 | 204k | #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 | 156 | { |
62 | 156 | const char *exe_path = (*argv)[0]; |
63 | 156 | if (CPLGetConfigOption("GDAL_DATA", nullptr) == nullptr) |
64 | 156 | { |
65 | 156 | CPLSetConfigOption("GDAL_DATA", CPLGetPathSafe(exe_path).c_str()); |
66 | 156 | } |
67 | 156 | CPLSetConfigOption("CPL_TMPDIR", "/tmp"); |
68 | 156 | CPLSetConfigOption("DISABLE_OPEN_REAL_NETCDF_FILES", "YES"); |
69 | 156 | CPLSetConfigOption("GDAL_HTTP_TIMEOUT", "1"); |
70 | 156 | CPLSetConfigOption("GDAL_HTTP_CONNECTTIMEOUT", "1"); |
71 | | // To avoid timeouts. See https://github.com/OSGeo/gdal/issues/502 |
72 | 156 | CPLSetConfigOption("DXF_MAX_BSPLINE_CONTROL_POINTS", "100"); |
73 | 156 | CPLSetConfigOption("NAS_INDICATOR", |
74 | 156 | "NAS-Operationen;AAA-Fachschema;aaa.xsd;aaa-suite"); |
75 | 156 | CPLSetConfigOption( |
76 | 156 | "USERNAME", |
77 | 156 | "unknown"); // see GMLASConfiguration::GetBaseCacheDirectory() |
78 | | |
79 | 156 | #ifdef OGR_SKIP |
80 | 156 | CPLSetConfigOption("OGR_SKIP", OGR_SKIP); |
81 | 156 | #endif |
82 | 156 | REGISTER_FUNC(); |
83 | | |
84 | 156 | return 0; |
85 | 156 | } Line | Count | Source | 61 | 78 | { | 62 | 78 | const char *exe_path = (*argv)[0]; | 63 | 78 | if (CPLGetConfigOption("GDAL_DATA", nullptr) == nullptr) | 64 | 78 | { | 65 | 78 | CPLSetConfigOption("GDAL_DATA", CPLGetPathSafe(exe_path).c_str()); | 66 | 78 | } | 67 | 78 | CPLSetConfigOption("CPL_TMPDIR", "/tmp"); | 68 | 78 | CPLSetConfigOption("DISABLE_OPEN_REAL_NETCDF_FILES", "YES"); | 69 | 78 | CPLSetConfigOption("GDAL_HTTP_TIMEOUT", "1"); | 70 | 78 | CPLSetConfigOption("GDAL_HTTP_CONNECTTIMEOUT", "1"); | 71 | | // To avoid timeouts. See https://github.com/OSGeo/gdal/issues/502 | 72 | 78 | CPLSetConfigOption("DXF_MAX_BSPLINE_CONTROL_POINTS", "100"); | 73 | 78 | CPLSetConfigOption("NAS_INDICATOR", | 74 | 78 | "NAS-Operationen;AAA-Fachschema;aaa.xsd;aaa-suite"); | 75 | 78 | CPLSetConfigOption( | 76 | 78 | "USERNAME", | 77 | 78 | "unknown"); // see GMLASConfiguration::GetBaseCacheDirectory() | 78 | | | 79 | 78 | #ifdef OGR_SKIP | 80 | 78 | CPLSetConfigOption("OGR_SKIP", OGR_SKIP); | 81 | 78 | #endif | 82 | 78 | REGISTER_FUNC(); | 83 | | | 84 | 78 | return 0; | 85 | 78 | } |
Line | Count | Source | 61 | 78 | { | 62 | 78 | const char *exe_path = (*argv)[0]; | 63 | 78 | if (CPLGetConfigOption("GDAL_DATA", nullptr) == nullptr) | 64 | 78 | { | 65 | 78 | CPLSetConfigOption("GDAL_DATA", CPLGetPathSafe(exe_path).c_str()); | 66 | 78 | } | 67 | 78 | CPLSetConfigOption("CPL_TMPDIR", "/tmp"); | 68 | 78 | CPLSetConfigOption("DISABLE_OPEN_REAL_NETCDF_FILES", "YES"); | 69 | 78 | CPLSetConfigOption("GDAL_HTTP_TIMEOUT", "1"); | 70 | 78 | CPLSetConfigOption("GDAL_HTTP_CONNECTTIMEOUT", "1"); | 71 | | // To avoid timeouts. See https://github.com/OSGeo/gdal/issues/502 | 72 | 78 | CPLSetConfigOption("DXF_MAX_BSPLINE_CONTROL_POINTS", "100"); | 73 | 78 | CPLSetConfigOption("NAS_INDICATOR", | 74 | 78 | "NAS-Operationen;AAA-Fachschema;aaa.xsd;aaa-suite"); | 75 | 78 | CPLSetConfigOption( | 76 | 78 | "USERNAME", | 77 | 78 | "unknown"); // see GMLASConfiguration::GetBaseCacheDirectory() | 78 | | | 79 | 78 | #ifdef OGR_SKIP | 80 | 78 | CPLSetConfigOption("OGR_SKIP", OGR_SKIP); | 81 | 78 | #endif | 82 | 78 | REGISTER_FUNC(); | 83 | | | 84 | 78 | return 0; | 85 | 78 | } |
|
86 | | |
87 | | int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len) |
88 | 431k | { |
89 | | #ifdef USE_FILESYSTEM |
90 | | char szTempFilename[64]; |
91 | | snprintf(szTempFilename, sizeof(szTempFilename), "/tmp/gdal_fuzzer_%d.%s", |
92 | 21.4k | (int)getpid(), EXTENSION); |
93 | | VSILFILE *fp = VSIFOpenL(szTempFilename, "wb"); |
94 | 21.4k | if (!fp) |
95 | 0 | { |
96 | 0 | fprintf(stderr, "Cannot create %s\n", szTempFilename); |
97 | 0 | return 1; |
98 | 0 | } |
99 | 21.4k | VSIFWriteL(buf, 1, len, fp); |
100 | | #else |
101 | | VSILFILE *fp = VSIFileFromMemBuffer( |
102 | 204k | MEM_FILENAME, reinterpret_cast<GByte *>(const_cast<uint8_t *>(buf)), |
103 | 410k | len, FALSE); |
104 | | #endif |
105 | 21.4k | VSIFCloseL(fp); |
106 | | |
107 | 21.4k | CPLPushErrorHandler(CPLQuietErrorHandler); |
108 | | #ifdef USE_FILESYSTEM |
109 | 21.4k | 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 | 7.59k | for (int i = 0; papszFiles && papszFiles[i]; ++i) |
116 | 7.55k | { |
117 | 7.55k | if (EQUAL(CPLGetExtensionSafe(papszFiles[i]).c_str(), "pol") || |
118 | 5.94k | EQUAL(CPLGetExtensionSafe(papszFiles[i]).c_str(), "arc") || |
119 | 5.83k | EQUAL(CPLGetExtensionSafe(papszFiles[i]).c_str(), "pnt")) |
120 | 1.93k | { |
121 | 1.93k | osFileInTar = papszFiles[i]; |
122 | 1.93k | break; |
123 | 1.93k | } |
124 | 7.55k | } |
125 | | CSLDestroy(papszFiles); |
126 | | OGRDataSourceH hDS = nullptr; |
127 | 1.98k | if (!osFileInTar.empty()) |
128 | 1.93k | { |
129 | 1.93k | hDS = OGROpen(std::string(osVsitarPrefix) |
130 | 1.93k | .append(MEM_FILENAME) |
131 | 1.93k | .append("/") |
132 | 1.93k | .append(osFileInTar) |
133 | 1.93k | .c_str(), |
134 | 1.93k | FALSE, nullptr); |
135 | 1.93k | } |
136 | | #else |
137 | 408k | OGRDataSourceH hDS = OGROpen(GDAL_FILENAME, FALSE, nullptr); |
138 | | #endif |
139 | 431k | if (hDS) |
140 | 295k | { |
141 | 295k | const int nLayers = OGR_DS_GetLayerCount(hDS); |
142 | 295k | time_t nStartTime = time(nullptr); |
143 | 295k | bool bStop = false; |
144 | 796k | for (int i = 0; !bStop && i < 10 && i < nLayers; i++) |
145 | 501k | { |
146 | 501k | OGRLayerH hLayer = OGR_DS_GetLayer(hDS, i); |
147 | 501k | OGR_L_GetSpatialRef(hLayer); |
148 | 501k | OGR_L_GetGeomType(hLayer); |
149 | 501k | OGR_L_GetFIDColumn(hLayer); |
150 | 501k | OGR_L_GetGeometryColumn(hLayer); |
151 | 501k | OGRFeatureH hFeature; |
152 | 501k | OGRFeatureH hFeaturePrev = nullptr; |
153 | 501k | for (int j = 0; |
154 | 20.6M | j < 1000 && !bStop && |
155 | 20.6M | (hFeature = OGR_L_GetNextFeature(hLayer)) != nullptr; |
156 | 20.1M | j++) |
157 | 20.1M | { |
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 | 20.1M | 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 | 20.1M | if (hFeaturePrev) |
172 | 19.8M | OGR_F_Destroy(hFeaturePrev); |
173 | 20.1M | hFeaturePrev = hFeature; |
174 | 20.1M | } |
175 | 501k | if (hFeaturePrev) |
176 | 274k | OGR_F_Destroy(hFeaturePrev); |
177 | 501k | } |
178 | 295k | OGR_DS_Destroy(hDS); |
179 | 295k | } |
180 | 21.4k | CPLPopErrorHandler(); |
181 | | #ifdef USE_FILESYSTEM |
182 | | VSIUnlink(szTempFilename); |
183 | | #else |
184 | 204k | VSIUnlink(MEM_FILENAME); |
185 | | #endif |
186 | 21.4k | return 0; |
187 | 431k | } Line | Count | Source | 88 | 204k | { | 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 | 204k | VSILFILE *fp = VSIFileFromMemBuffer( | 102 | 204k | MEM_FILENAME, reinterpret_cast<GByte *>(const_cast<uint8_t *>(buf)), | 103 | 204k | len, FALSE); | 104 | 204k | #endif | 105 | 204k | VSIFCloseL(fp); | 106 | | | 107 | 204k | 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 | 204k | OGRDataSourceH hDS = OGROpen(GDAL_FILENAME, FALSE, nullptr); | 138 | 204k | #endif | 139 | 204k | if (hDS) | 140 | 140k | { | 141 | 140k | const int nLayers = OGR_DS_GetLayerCount(hDS); | 142 | 140k | time_t nStartTime = time(nullptr); | 143 | 140k | bool bStop = false; | 144 | 378k | for (int i = 0; !bStop && i < 10 && i < nLayers; i++) | 145 | 237k | { | 146 | 237k | OGRLayerH hLayer = OGR_DS_GetLayer(hDS, i); | 147 | 237k | OGR_L_GetSpatialRef(hLayer); | 148 | 237k | OGR_L_GetGeomType(hLayer); | 149 | 237k | OGR_L_GetFIDColumn(hLayer); | 150 | 237k | OGR_L_GetGeometryColumn(hLayer); | 151 | 237k | OGRFeatureH hFeature; | 152 | 237k | OGRFeatureH hFeaturePrev = nullptr; | 153 | 237k | for (int j = 0; | 154 | 10.0M | j < 1000 && !bStop && | 155 | 10.0M | (hFeature = OGR_L_GetNextFeature(hLayer)) != nullptr; | 156 | 9.82M | j++) | 157 | 9.82M | { | 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 | 9.82M | 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 | 9.82M | if (hFeaturePrev) | 172 | 9.68M | OGR_F_Destroy(hFeaturePrev); | 173 | 9.82M | hFeaturePrev = hFeature; | 174 | 9.82M | } | 175 | 237k | if (hFeaturePrev) | 176 | 132k | OGR_F_Destroy(hFeaturePrev); | 177 | 237k | } | 178 | 140k | OGR_DS_Destroy(hDS); | 179 | 140k | } | 180 | 204k | CPLPopErrorHandler(); | 181 | | #ifdef USE_FILESYSTEM | 182 | | VSIUnlink(szTempFilename); | 183 | | #else | 184 | 204k | VSIUnlink(MEM_FILENAME); | 185 | 204k | #endif | 186 | 204k | return 0; | 187 | 204k | } |
Line | Count | Source | 88 | 204k | { | 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 | 204k | VSILFILE *fp = VSIFileFromMemBuffer( | 102 | 204k | MEM_FILENAME, reinterpret_cast<GByte *>(const_cast<uint8_t *>(buf)), | 103 | 204k | len, FALSE); | 104 | 204k | #endif | 105 | 204k | VSIFCloseL(fp); | 106 | | | 107 | 204k | 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 | 204k | OGRDataSourceH hDS = OGROpen(GDAL_FILENAME, FALSE, nullptr); | 138 | 204k | #endif | 139 | 204k | if (hDS) | 140 | 140k | { | 141 | 140k | const int nLayers = OGR_DS_GetLayerCount(hDS); | 142 | 140k | time_t nStartTime = time(nullptr); | 143 | 140k | bool bStop = false; | 144 | 378k | for (int i = 0; !bStop && i < 10 && i < nLayers; i++) | 145 | 237k | { | 146 | 237k | OGRLayerH hLayer = OGR_DS_GetLayer(hDS, i); | 147 | 237k | OGR_L_GetSpatialRef(hLayer); | 148 | 237k | OGR_L_GetGeomType(hLayer); | 149 | 237k | OGR_L_GetFIDColumn(hLayer); | 150 | 237k | OGR_L_GetGeometryColumn(hLayer); | 151 | 237k | OGRFeatureH hFeature; | 152 | 237k | OGRFeatureH hFeaturePrev = nullptr; | 153 | 237k | for (int j = 0; | 154 | 10.0M | j < 1000 && !bStop && | 155 | 10.0M | (hFeature = OGR_L_GetNextFeature(hLayer)) != nullptr; | 156 | 9.82M | j++) | 157 | 9.82M | { | 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 | 9.82M | 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 | 9.82M | if (hFeaturePrev) | 172 | 9.68M | OGR_F_Destroy(hFeaturePrev); | 173 | 9.82M | hFeaturePrev = hFeature; | 174 | 9.82M | } | 175 | 237k | if (hFeaturePrev) | 176 | 132k | OGR_F_Destroy(hFeaturePrev); | 177 | 237k | } | 178 | 140k | OGR_DS_Destroy(hDS); | 179 | 140k | } | 180 | 204k | CPLPopErrorHandler(); | 181 | | #ifdef USE_FILESYSTEM | 182 | | VSIUnlink(szTempFilename); | 183 | | #else | 184 | 204k | VSIUnlink(MEM_FILENAME); | 185 | 204k | #endif | 186 | 204k | return 0; | 187 | 204k | } |
Line | Count | Source | 88 | 21.4k | { | 89 | 21.4k | #ifdef USE_FILESYSTEM | 90 | 21.4k | char szTempFilename[64]; | 91 | 21.4k | snprintf(szTempFilename, sizeof(szTempFilename), "/tmp/gdal_fuzzer_%d.%s", | 92 | 21.4k | (int)getpid(), EXTENSION); | 93 | 21.4k | VSILFILE *fp = VSIFOpenL(szTempFilename, "wb"); | 94 | 21.4k | if (!fp) | 95 | 0 | { | 96 | 0 | fprintf(stderr, "Cannot create %s\n", szTempFilename); | 97 | 0 | return 1; | 98 | 0 | } | 99 | 21.4k | 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 | 21.4k | VSIFCloseL(fp); | 106 | | | 107 | 21.4k | CPLPushErrorHandler(CPLQuietErrorHandler); | 108 | 21.4k | #ifdef USE_FILESYSTEM | 109 | 21.4k | 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 | 21.4k | if (hDS) | 140 | 12.8k | { | 141 | 12.8k | const int nLayers = OGR_DS_GetLayerCount(hDS); | 142 | 12.8k | time_t nStartTime = time(nullptr); | 143 | 12.8k | bool bStop = false; | 144 | 37.9k | for (int i = 0; !bStop && i < 10 && i < nLayers; i++) | 145 | 25.1k | { | 146 | 25.1k | OGRLayerH hLayer = OGR_DS_GetLayer(hDS, i); | 147 | 25.1k | OGR_L_GetSpatialRef(hLayer); | 148 | 25.1k | OGR_L_GetGeomType(hLayer); | 149 | 25.1k | OGR_L_GetFIDColumn(hLayer); | 150 | 25.1k | OGR_L_GetGeometryColumn(hLayer); | 151 | 25.1k | OGRFeatureH hFeature; | 152 | 25.1k | OGRFeatureH hFeaturePrev = nullptr; | 153 | 25.1k | for (int j = 0; | 154 | 491k | j < 1000 && !bStop && | 155 | 491k | (hFeature = OGR_L_GetNextFeature(hLayer)) != nullptr; | 156 | 466k | j++) | 157 | 466k | { | 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 | 466k | 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 | 466k | if (hFeaturePrev) | 172 | 456k | OGR_F_Destroy(hFeaturePrev); | 173 | 466k | hFeaturePrev = hFeature; | 174 | 466k | } | 175 | 25.1k | if (hFeaturePrev) | 176 | 9.57k | OGR_F_Destroy(hFeaturePrev); | 177 | 25.1k | } | 178 | 12.8k | OGR_DS_Destroy(hDS); | 179 | 12.8k | } | 180 | 21.4k | CPLPopErrorHandler(); | 181 | 21.4k | #ifdef USE_FILESYSTEM | 182 | 21.4k | VSIUnlink(szTempFilename); | 183 | | #else | 184 | | VSIUnlink(MEM_FILENAME); | 185 | | #endif | 186 | 21.4k | return 0; | 187 | 21.4k | } |
Line | Count | Source | 88 | 1.98k | { | 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 | 1.98k | VSILFILE *fp = VSIFileFromMemBuffer( | 102 | 1.98k | MEM_FILENAME, reinterpret_cast<GByte *>(const_cast<uint8_t *>(buf)), | 103 | 1.98k | len, FALSE); | 104 | 1.98k | #endif | 105 | 1.98k | VSIFCloseL(fp); | 106 | | | 107 | 1.98k | 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 | 1.98k | char **papszFiles = | 113 | 1.98k | VSIReadDir(std::string(osVsitarPrefix).append(MEM_FILENAME).c_str()); | 114 | 1.98k | std::string osFileInTar; | 115 | 7.59k | for (int i = 0; papszFiles && papszFiles[i]; ++i) | 116 | 7.55k | { | 117 | 7.55k | if (EQUAL(CPLGetExtensionSafe(papszFiles[i]).c_str(), "pol") || | 118 | 5.94k | EQUAL(CPLGetExtensionSafe(papszFiles[i]).c_str(), "arc") || | 119 | 5.83k | EQUAL(CPLGetExtensionSafe(papszFiles[i]).c_str(), "pnt")) | 120 | 1.93k | { | 121 | 1.93k | osFileInTar = papszFiles[i]; | 122 | 1.93k | break; | 123 | 1.93k | } | 124 | 7.55k | } | 125 | 1.98k | CSLDestroy(papszFiles); | 126 | 1.98k | OGRDataSourceH hDS = nullptr; | 127 | 1.98k | if (!osFileInTar.empty()) | 128 | 1.93k | { | 129 | 1.93k | hDS = OGROpen(std::string(osVsitarPrefix) | 130 | 1.93k | .append(MEM_FILENAME) | 131 | 1.93k | .append("/") | 132 | 1.93k | .append(osFileInTar) | 133 | 1.93k | .c_str(), | 134 | 1.93k | FALSE, nullptr); | 135 | 1.93k | } | 136 | | #else | 137 | | OGRDataSourceH hDS = OGROpen(GDAL_FILENAME, FALSE, nullptr); | 138 | | #endif | 139 | 1.98k | if (hDS) | 140 | 364 | { | 141 | 364 | const int nLayers = OGR_DS_GetLayerCount(hDS); | 142 | 364 | time_t nStartTime = time(nullptr); | 143 | 364 | bool bStop = false; | 144 | 728 | for (int i = 0; !bStop && i < 10 && i < nLayers; i++) | 145 | 364 | { | 146 | 364 | OGRLayerH hLayer = OGR_DS_GetLayer(hDS, i); | 147 | 364 | OGR_L_GetSpatialRef(hLayer); | 148 | 364 | OGR_L_GetGeomType(hLayer); | 149 | 364 | OGR_L_GetFIDColumn(hLayer); | 150 | 364 | OGR_L_GetGeometryColumn(hLayer); | 151 | 364 | OGRFeatureH hFeature; | 152 | 364 | OGRFeatureH hFeaturePrev = nullptr; | 153 | 364 | for (int j = 0; | 154 | 10.5k | j < 1000 && !bStop && | 155 | 10.5k | (hFeature = OGR_L_GetNextFeature(hLayer)) != nullptr; | 156 | 10.1k | j++) | 157 | 10.1k | { | 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 | 10.1k | 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 | 10.1k | if (hFeaturePrev) | 172 | 9.96k | OGR_F_Destroy(hFeaturePrev); | 173 | 10.1k | hFeaturePrev = hFeature; | 174 | 10.1k | } | 175 | 364 | if (hFeaturePrev) | 176 | 228 | OGR_F_Destroy(hFeaturePrev); | 177 | 364 | } | 178 | 364 | OGR_DS_Destroy(hDS); | 179 | 364 | } | 180 | 1.98k | CPLPopErrorHandler(); | 181 | | #ifdef USE_FILESYSTEM | 182 | | VSIUnlink(szTempFilename); | 183 | | #else | 184 | 1.98k | VSIUnlink(MEM_FILENAME); | 185 | 1.98k | #endif | 186 | 1.98k | return 0; | 187 | 1.98k | } |
|