Commit 0541ce21 authored by Gregor Jasny's avatar Gregor Jasny Committed by Brad King

SystemTools: Fix off-by-one in GetLineFromStream with size limit

Logic for the size limit argument added by commit 521c5483 (added a
limit to the getline method, 2007-03-01) had an off-by-one error in
truncating the buffer.  Fix it and add a test case.
parent 95a7e234
......@@ -4289,7 +4289,7 @@ bool SystemTools::GetLineFromStream(std::istream& is, std::string& line,
// if we read too much then truncate the buffer
if (leftToRead > 0) {
if (static_cast<long>(length) > leftToRead) {
buffer[leftToRead - 1] = 0;
buffer[leftToRead] = 0;
leftToRead = 0;
} else {
leftToRead -= static_cast<long>(length);
......
......@@ -6,11 +6,13 @@
#pragma warning(disable : 4786)
#endif
#include KWSYS_HEADER(FStream.hxx)
#include KWSYS_HEADER(SystemTools.hxx)
// Work-around CMake dependency scanning limitation. This must
// duplicate the above list of headers.
#if 0
#include "FStream.hxx.in"
#include "SystemTools.hxx.in"
#endif
......@@ -857,6 +859,55 @@ static bool CheckFind()
return res;
}
static bool CheckGetLineFromStream()
{
const std::string fileWithFiveCharsOnFirstLine(TEST_SYSTEMTOOLS_SOURCE_DIR
"/README.rst");
kwsys::ifstream file(fileWithFiveCharsOnFirstLine.c_str(), std::ios::in);
if (!file) {
std::cerr << "Problem opening: " << fileWithFiveCharsOnFirstLine
<< std::endl;
return false;
}
std::string line;
bool has_newline = false;
bool result;
file.seekg(0, std::ios::beg);
result = kwsys::SystemTools::GetLineFromStream(file, line, &has_newline, -1);
if (!result || line.size() != 5) {
std::cerr << "First line does not have five characters: " << line.size()
<< std::endl;
return false;
}
file.seekg(0, std::ios::beg);
result = kwsys::SystemTools::GetLineFromStream(file, line, &has_newline, -1);
if (!result || line.size() != 5) {
std::cerr << "First line does not have five characters after rewind: "
<< line.size() << std::endl;
return false;
}
bool ret = true;
for (long size = 1; size <= 5; ++size) {
file.seekg(0, std::ios::beg);
result =
kwsys::SystemTools::GetLineFromStream(file, line, &has_newline, size);
if (!result || line.size() != size) {
std::cerr << "Should have read " << size << " characters but got "
<< line.size() << std::endl;
ret = false;
}
}
return ret;
}
//----------------------------------------------------------------------------
int testSystemTools(int, char* [])
{
......@@ -893,5 +944,7 @@ int testSystemTools(int, char* [])
res &= CheckFind();
res &= CheckGetLineFromStream();
return res ? 0 : 1;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment