From a9cf7b84435951ab2ce7d4d9629bc4619226264a Mon Sep 17 00:00:00 2001 From: "Michael J. Spencer" Date: Wed, 20 Oct 2010 15:23:58 +0000 Subject: [PATCH] System-Win32/Path: Fix incorrect assumption in isValid. A recent commit to clang exposed a bug in the Win32 Path code. This is a minimal fix for it. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@116925 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/System/Win32/Path.inc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/System/Win32/Path.inc b/lib/System/Win32/Path.inc index 4a6dbd3ddf2..2dbf13e8ccb 100644 --- a/lib/System/Win32/Path.inc +++ b/lib/System/Win32/Path.inc @@ -64,6 +64,13 @@ Path::operator=(StringRef that) { return *this; } +// push_back 0 on create, and pop_back on delete. +struct ScopedNullTerminator { + std::string &str; + ScopedNullTerminator(std::string &s) : str(s) { str.push_back(0); } + ~ScopedNullTerminator() { str.pop_back(); } +}; + bool Path::isValid() const { if (path.empty()) @@ -72,6 +79,8 @@ Path::isValid() const { // If there is a colon, it must be the second character, preceded by a letter // and followed by something. size_t len = path.size(); + // This code assumes that path is null terminated, so make sure it is. + ScopedNullTerminator snt(path); size_t pos = path.rfind(':',len); size_t rootslash = 0; if (pos != std::string::npos) {