From 7083ac56c780ea07809b48a22f6d7e9a9d70d25e Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Tue, 18 Feb 2025 18:56:38 +0100 Subject: [PATCH] CSV: emit error when unbalanced double quotes are detected Fixes #11845 --- .../ogr/data/csv/unbalanced_double_quotes.csv | 3 +++ autotest/ogr/ogr_csv.py | 16 ++++++++++++++++ port/cpl_csv.cpp | 8 ++++++++ 3 files changed, 27 insertions(+) create mode 100644 autotest/ogr/data/csv/unbalanced_double_quotes.csv diff --git a/autotest/ogr/data/csv/unbalanced_double_quotes.csv b/autotest/ogr/data/csv/unbalanced_double_quotes.csv new file mode 100644 index 000000000000..dc36a60ed855 --- /dev/null +++ b/autotest/ogr/data/csv/unbalanced_double_quotes.csv @@ -0,0 +1,3 @@ +id,txt +1,"foo"" +2,bar diff --git a/autotest/ogr/ogr_csv.py b/autotest/ogr/ogr_csv.py index b7f2c87a588c..d1e6be1c8b3e 100755 --- a/autotest/ogr/ogr_csv.py +++ b/autotest/ogr/ogr_csv.py @@ -3482,6 +3482,22 @@ def test_ogr_schema_override_wkt(tmp_vsimem): assert f.GetGeometryRef().ExportToWkt() == "POINT (1 2)" +############################################################################### +# Test reading CSV with unbalanced double-quotes + + +@gdaltest.enable_exceptions() +def test_ogr_csv_unbalanced_double_quotes(): + + with ogr.Open("data/csv/unbalanced_double_quotes.csv") as ds: + lyr = ds.GetLayer(0) + with pytest.raises( + Exception, + match="CSV file has unbalanced number of double-quotes. Corrupted data will likely be returned", + ): + lyr.GetNextFeature() + + ############################################################################### diff --git a/port/cpl_csv.cpp b/port/cpl_csv.cpp index 36e0216f39ff..332074647fdb 100644 --- a/port/cpl_csv.cpp +++ b/port/cpl_csv.cpp @@ -706,6 +706,14 @@ CSVReadParseLineGeneric(void *fp, const char *(*pfnReadLine)(void *, size_t), { CPLError(CE_Failure, CPLE_OutOfMemory, "%s", e.what()); } + + if (bInString) + { + CPLError(CE_Failure, CPLE_AppDefined, + "CSV file has unbalanced number of double-quotes. Corrupted " + "data will likely be returned"); + } + return nullptr; }