Coverage Report

Created: 2026-03-30 09:00

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
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
}
LLVMFuzzerInitialize
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
}
LLVMFuzzerInitialize
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
}
LLVMFuzzerTestOneInput
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
}
LLVMFuzzerTestOneInput
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
}
LLVMFuzzerTestOneInput
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
}
LLVMFuzzerTestOneInput
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
}