From 9918523077311b89d6d2ccb2e036503e5ffea437 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Fri, 9 Mar 2018 21:31:46 +0100 Subject: [PATCH] :memo: cleanup after #1001 --- README.md | 1 + test/src/unit-class_parser.cpp | 85 ---------------------------------- test/src/unit-regression.cpp | 83 +++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 85 deletions(-) diff --git a/README.md b/README.md index 2cb8603b..1d065407 100644 --- a/README.md +++ b/README.md @@ -974,6 +974,7 @@ I deeply appreciate the help of the following people. - [johnfb](https://github.com/johnfb) found a bug in the implementation of CBOR's indefinite length strings. - [Paul Fultz II](https://github.com/pfultz2) added a note on the cget package manager. - [Wilson Lin](https://github.com/wla80) made the integration section of the README more concise. +- [RalfBielig](https://github.com/ralfbielig) detected and fixed a memory leak in the parser callback. Thanks a lot for helping out! Please [let me know](mailto:mail@nlohmann.me) if I forgot someone. diff --git a/test/src/unit-class_parser.cpp b/test/src/unit-class_parser.cpp index 2efc98d1..3e309469 100644 --- a/test/src/unit-class_parser.cpp +++ b/test/src/unit-class_parser.cpp @@ -1415,91 +1415,6 @@ TEST_CASE("parser class") }); CHECK(j_empty_array == json()); } - - /* - SECTION("skip in GeoJSON") - { - auto geojsonExample = R"( - { "type": "FeatureCollection", - "features": [ - { "type": "Feature", - "geometry": {"type": "Point", "coordinates": [102.0, 0.5]}, - "properties": {"prop0": "value0"} - }, - { "type": "Feature", - "geometry": { - "type": "LineString", - "coordinates": [ - [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0] - ] - }, - "properties": { - "prop0": "value0", - "prop1": 0.0 - } - }, - { "type": "Feature", - "geometry": { - "type": "Polygon", - "coordinates": [ - [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], - [100.0, 1.0], [100.0, 0.0] ] - ] - }, - "properties": { - "prop0": "value0", - "prop1": {"this": "that"} - } - } - ] - })"; - - json::parser_callback_t cb = [&](int, json::parse_event_t event, json & parsed) - { - // skip uninteresting events - if (event == json::parse_event_t::value and !parsed.is_primitive()) - { - return false; - } - - switch (event) - { - case json::parse_event_t::key: - { - return true; - } - case json::parse_event_t::value: - { - return false; - } - case json::parse_event_t::object_start: - { - return true; - } - case json::parse_event_t::object_end: - { - return false; - } - case json::parse_event_t::array_start: - { - return true; - } - case json::parse_event_t::array_end: - { - return false; - } - - default: - { - return true; - } - } - }; - - auto j = json::parse(geojsonExample, cb, true); - CHECK(j == json()); - } - */ } SECTION("constructing from contiguous containers") diff --git a/test/src/unit-regression.cpp b/test/src/unit-regression.cpp index c84c2750..604def6c 100644 --- a/test/src/unit-regression.cpp +++ b/test/src/unit-regression.cpp @@ -1514,4 +1514,87 @@ TEST_CASE("regression tests") CHECK(ff.x == 3); nlohmann::json nj = lj; // This line works as expected } + + SECTION("issue #1001 - Fix memory leak during parser callback") + { + auto geojsonExample = R"( + { "type": "FeatureCollection", + "features": [ + { "type": "Feature", + "geometry": {"type": "Point", "coordinates": [102.0, 0.5]}, + "properties": {"prop0": "value0"} + }, + { "type": "Feature", + "geometry": { + "type": "LineString", + "coordinates": [ + [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0] + ] + }, + "properties": { + "prop0": "value0", + "prop1": 0.0 + } + }, + { "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], + [100.0, 1.0], [100.0, 0.0] ] + ] + }, + "properties": { + "prop0": "value0", + "prop1": {"this": "that"} + } + } + ] + })"; + + json::parser_callback_t cb = [&](int, json::parse_event_t event, json & parsed) + { + // skip uninteresting events + if (event == json::parse_event_t::value and !parsed.is_primitive()) + { + return false; + } + + switch (event) + { + case json::parse_event_t::key: + { + return true; + } + case json::parse_event_t::value: + { + return false; + } + case json::parse_event_t::object_start: + { + return true; + } + case json::parse_event_t::object_end: + { + return false; + } + case json::parse_event_t::array_start: + { + return true; + } + case json::parse_event_t::array_end: + { + return false; + } + + default: + { + return true; + } + } + }; + + auto j = json::parse(geojsonExample, cb, true); + CHECK(j == json()); + } }