Coverage Report

Created: 2026-08-14 09:29

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}
LLVMFuzzerInitialize
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
}
LLVMFuzzerInitialize
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
}
LLVMFuzzerTestOneInput
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
}
LLVMFuzzerTestOneInput
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
}
LLVMFuzzerTestOneInput
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
}
LLVMFuzzerTestOneInput
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
}