diff --git a/SystemTools.cxx b/SystemTools.cxx
index b018a432cb1535dfe08b198c61016e6060044e2c..301ce5729045c35f4d01f1e29d9039fdfe1a2b20 100644
--- a/SystemTools.cxx
+++ b/SystemTools.cxx
@@ -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);
diff --git a/testSystemTools.cxx b/testSystemTools.cxx
index b04f2cbf0e02b80753dda07dcbfbae7bace2469d..1e3947e49666be97ad727a3df5748e670d7a70a1 100644
--- a/testSystemTools.cxx
+++ b/testSystemTools.cxx
@@ -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;
 }