[cfe-dev] [PATCH] [libc++] Ensure std::getline always 0-terminates string.

Reimar Döffinger via cfe-dev cfe-dev at lists.llvm.org
Thu Sep 7 23:17:18 PDT 2017


If the sentinel failed (e.g. due to having reached
EOF before) or an exception was caught it failed to
do that.
While it seems (unfortunately!) not required by the
specification, libstdc++ does 0-terminate and not
doing so risks creating security issues in applications.
---
 include/istream | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/include/istream b/include/istream
index 0b8e05d95..5c73df38f 100644
--- a/include/istream
+++ b/include/istream
@@ -1069,16 +1069,18 @@ basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_typ
                 this->rdbuf()->sbumpc();
                 ++__gc_;
             }
-            if (__n > 0)
-                *__s = char_type();
             if (__gc_ == 0)
                __err |= ios_base::failbit;
             this->setstate(__err);
         }
+        if (__n > 0)
+            *__s = char_type();
 #ifndef _LIBCPP_NO_EXCEPTIONS
     }
     catch (...)
     {
+        if (__n > 0)
+            *__s = char_type();
         this->__set_badbit_and_consider_rethrow();
     }
 #endif  // _LIBCPP_NO_EXCEPTIONS
-- 
2.14.1




More information about the cfe-dev mailing list