diff options
| -rw-r--r-- | llvm/include/llvm/Bitcode/Deserialize.h | 2 | ||||
| -rw-r--r-- | llvm/lib/Bitcode/Reader/Deserialize.cpp | 13 | 
2 files changed, 11 insertions, 4 deletions
diff --git a/llvm/include/llvm/Bitcode/Deserialize.h b/llvm/include/llvm/Bitcode/Deserialize.h index 430100ee286..dc1cdc0898d 100644 --- a/llvm/include/llvm/Bitcode/Deserialize.h +++ b/llvm/include/llvm/Bitcode/Deserialize.h @@ -156,7 +156,7 @@ public:    }    char* ReadCStr(char* cstr = NULL, unsigned MaxLen=0, bool isNullTerm=true); -  void ReadCStr(std::vector<char>& buff, bool isNullTerm=false); +  void ReadCStr(std::vector<char>& buff, bool isNullTerm=false, unsigned Idx=0);    template <typename T>    inline T* ReadOwnedPtr(bool AutoRegister = true) { diff --git a/llvm/lib/Bitcode/Reader/Deserialize.cpp b/llvm/lib/Bitcode/Reader/Deserialize.cpp index cb32f7d5efe..8e0b62c5095 100644 --- a/llvm/lib/Bitcode/Reader/Deserialize.cpp +++ b/llvm/lib/Bitcode/Reader/Deserialize.cpp @@ -329,11 +329,18 @@ char* Deserializer::ReadCStr(char* cstr, unsigned MaxLen, bool isNullTerm) {    return cstr;  } -void Deserializer::ReadCStr(std::vector<char>& buff, bool isNullTerm) { +void Deserializer::ReadCStr(std::vector<char>& buff, bool isNullTerm, +                            unsigned Idx) { +      unsigned len = ReadInt(); -  buff.clear();   -  buff.reserve(len); +  // If Idx is beyond the current before size, reduce Idx to refer to the +  // element after the last element. +  if (Idx > buff.size()) +    Idx = buff.size(); + +  buff.reserve(len+Idx); +  buff.resize(Idx);          for (unsigned i = 0; i < len; ++i)      buff.push_back((char) ReadInt());  | 

