Skip to content

Commit

Permalink
🚑 fix for #493
Browse files Browse the repository at this point in the history
Added a test to check if the input stream is good() before executing
getline on it. Also added two test cases that set the failbit and
badbit before calling file_line_buffer.
  • Loading branch information
nlohmann committed Mar 11, 2017
1 parent ff0b18d commit 4e49829
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 0 deletions.
7 changes: 7 additions & 0 deletions src/json.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10988,6 +10988,13 @@ class basic_json
m_line_buffer.erase(0, num_processed_chars);
// read next line from input stream
m_line_buffer_tmp.clear();

// check if stream is still good
if (not m_stream->good())
{
JSON_THROW(std::invalid_argument("stream error"));
}

std::getline(*m_stream, m_line_buffer_tmp, '\n');

// add line with newline symbol to the line buffer
Expand Down
7 changes: 7 additions & 0 deletions src/json.hpp.re2c
Original file line number Diff line number Diff line change
Expand Up @@ -10022,6 +10022,13 @@ class basic_json
m_line_buffer.erase(0, num_processed_chars);
// read next line from input stream
m_line_buffer_tmp.clear();

// check if stream is still good
if (not m_stream->good())
{
JSON_THROW(std::invalid_argument("stream error"));
}

std::getline(*m_stream, m_line_buffer_tmp, '\n');

// add line with newline symbol to the line buffer
Expand Down
32 changes: 32 additions & 0 deletions test/src/unit-regression.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ SOFTWARE.

#include "catch.hpp"

#define private public
#include "json.hpp"
using nlohmann::json;

Expand Down Expand Up @@ -804,4 +805,35 @@ TEST_CASE("regression tests")

CHECK(j["bool_vector"].dump() == "[false,true,false,false]");
}

SECTION("issue #495 - fill_line_buffer incorrectly tests m_stream for eof but not fail or bad bits")
{
SECTION("setting failbit")
{
std::stringstream ss;
ss << "[1,2,3\n,4,5]";

json::lexer l(ss);

CHECK(l.m_line_buffer == "[1,2,3\n");

l.m_stream->setstate(std::ios_base::failbit);

CHECK_THROWS_AS(l.fill_line_buffer(), std::invalid_argument);
}

SECTION("setting badbit")
{
std::stringstream ss;
ss << "[1,2,3\n,4,5]";

json::lexer l(ss);

CHECK(l.m_line_buffer == "[1,2,3\n");

l.m_stream->setstate(std::ios_base::badbit);

CHECK_THROWS_AS(l.fill_line_buffer(), std::invalid_argument);
}
}
}

0 comments on commit 4e49829

Please sign in to comment.