]> git.sesse.net Git - xml-template/commitdiff
Fix some use-after-frees in the C++11 version.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Thu, 17 Aug 2017 22:13:18 +0000 (00:13 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Thu, 17 Aug 2017 22:13:18 +0000 (00:13 +0200)
c++11/xml-template.cpp

index 4f0c9fef6e903aa4a9772de64e176d612dd3c291..bf6c085052356e0729c1f73600fcff36e13de4c7 100644 (file)
@@ -1,5 +1,6 @@
 #include "xml-template.h"
 
+#include <assert.h>
 #include <string.h>
 #include <libxml/parser.h>
 
@@ -144,6 +145,7 @@ Alternate::Alternate(const string &attribute,
                        continue;
                }
                string value = alternatives[jx++ % alternatives.size()];
+               Replace *r = new Replace { value };
                subdirectives_subs[ix]->substitution_map.insert(make_pair(
                        attribute,
                        new Replace { value }));
@@ -191,18 +193,21 @@ void Substitute::process(xmlNode *node, bool clean)
                        // Check all substitutions to see if we found anything appropriate.
                        string tag = reinterpret_cast<const char *>(child->name);
                        for (auto it : substitution_map) {
+                               assert(it.second != nullptr);
                                // Attribute substitution.
                                if (begins_with(it.first, tag + "/")) {
+                                       string contents = it.second->get_contents();
                                        const xmlChar *attr_key = reinterpret_cast<const xmlChar *>(
                                                it.first.c_str() + tag.size() + 1);
                                        const xmlChar *attr_value = reinterpret_cast<const xmlChar *>(
-                                               it.second->get_contents().c_str());
+                                               contents.c_str());
                                        xmlSetProp(child, attr_key, attr_value);
                                } else if ((!id.empty() && begins_with(it.first, "#" + id + "/"))) {
+                                       string contents = it.second->get_contents();
                                        const xmlChar *attr_key = reinterpret_cast<const xmlChar *>(
                                                it.first.c_str() + id.size() + 2);
                                        const xmlChar *attr_value = reinterpret_cast<const xmlChar *>(
-                                               it.second->get_contents().c_str());
+                                               contents.c_str());
                                        xmlSetProp(child, attr_key, attr_value);
                                }