lib/message.cc: stale pointer bug (v3)
authorVladimir Marek <vlmarek@volny.cz>
Thu, 2 May 2013 14:31:42 +0000 (16:31 +0200)
committerDavid Bremner <bremner@debian.org>
Sat, 4 May 2013 00:17:56 +0000 (21:17 -0300)
Xapian::TermIterator::operator* returns std::string which is destroyed
as soon as (*i).c_str() finishes. The remembered pointer 'term' then
references invalid memory.

Signed-off-by: Vladimir Marek <vlmarek@volny.cz>
lib/message.cc

index 8720c1b542d839a24613991b4b425fe03f65e1e3..c4261e614d4eb83b605bd2312cad727a57b9ab95 100644 (file)
@@ -266,18 +266,18 @@ _notmuch_message_get_term (notmuch_message_t *message,
                           const char *prefix)
 {
     int prefix_len = strlen (prefix);
                           const char *prefix)
 {
     int prefix_len = strlen (prefix);
-    const char *term = NULL;
     char *value;
 
     i.skip_to (prefix);
 
     char *value;
 
     i.skip_to (prefix);
 
-    if (i != end)
-       term = (*i).c_str ();
+    if (i == end)
+       return NULL;
 
 
-    if (!term || strncmp (term, prefix, prefix_len))
+    std::string term = *i;
+    if (strncmp (term.c_str(), prefix, prefix_len))
        return NULL;
 
        return NULL;
 
-    value = talloc_strdup (message, term + prefix_len);
+    value = talloc_strdup (message, term.c_str() + prefix_len);
 
 #if DEBUG_DATABASE_SANITY
     i++;
 
 #if DEBUG_DATABASE_SANITY
     i++;