[YAML] Plug a memory leak
authorBenjamin Kramer <benny.kra@googlemail.com>
Mon, 18 May 2015 21:11:27 +0000 (21:11 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Mon, 18 May 2015 21:11:27 +0000 (21:11 +0000)
The destructor of BlockScalarNode is never called. Store the contained
string in BumpPtrAllocated memory instead.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237614 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/YAMLParser.h
lib/Support/YAMLParser.cpp

index f0b6113e8368b77e5da3f978a5d5c925639460ed..5158b591e0fc9b4b0a6190dfb8c7b5a06e9f8c07 100644 (file)
@@ -235,8 +235,8 @@ class BlockScalarNode : public Node {
 
 public:
   BlockScalarNode(std::unique_ptr<Document> &D, StringRef Anchor, StringRef Tag,
-                  std::string &Value, StringRef RawVal)
-      : Node(NK_BlockScalar, D, Anchor, Tag), Value(std::move(Value)) {
+                  StringRef Value, StringRef RawVal)
+      : Node(NK_BlockScalar, D, Anchor, Tag), Value(Value) {
     SMLoc Start = SMLoc::getFromPointer(RawVal.begin());
     SMLoc End = SMLoc::getFromPointer(RawVal.end());
     SourceRange = SMRange(Start, End);
@@ -250,7 +250,7 @@ public:
   }
 
 private:
-  std::string Value;
+  StringRef Value;
 };
 
 /// \brief A key and value pair. While not technically a Node under the YAML
index 162a22bd91000ab5c736fa3cb974db04aaf96374..41d446744fe93dfbcc5a91a812dbfead70b1ea57 100644 (file)
@@ -2377,11 +2377,13 @@ parse_property:
                 , AnchorInfo.Range.substr(1)
                 , TagInfo.Range
                 , T.Range);
-  case Token::TK_BlockScalar:
+  case Token::TK_BlockScalar: {
     getNext();
+    StringRef StrCopy = StringRef(T.Value).copy(NodeAllocator);
     return new (NodeAllocator)
         BlockScalarNode(stream.CurrentDoc, AnchorInfo.Range.substr(1),
-                        TagInfo.Range, T.Value, T.Range);
+                        TagInfo.Range, StrCopy, T.Range);
+  }
   case Token::TK_Key:
     // Don't eat the TK_Key, KeyValueNode expects it.
     return new (NodeAllocator)