]> granicus.if.org Git - mutt/commitdiff
Skip over messages which were previously parsed after sorting the tail of the
authorMichael Elkins <me@sigpipe.org>
Sat, 8 Dec 2007 20:54:54 +0000 (12:54 -0800)
committerMichael Elkins <me@sigpipe.org>
Sat, 8 Dec 2007 20:54:54 +0000 (12:54 -0800)
list.  Avoids a segmentation fault when rescanning the new/ subdir of a maildir
when messages were left over from a previous scan.

mh.c

diff --git a/mh.c b/mh.c
index 01c338c361b7939fb7b6d95d42dafa0ece70cb0b..ece403820f8c95df489d2da4fcd76438c9cadc22 100644 (file)
--- a/mh.c
+++ b/mh.c
@@ -954,6 +954,25 @@ static void mh_sort_natural (CONTEXT *ctx, struct maildir **md)
   *md = maildir_sort (*md, (size_t) -1, md_cmp_path);
 }
 
+static struct maildir *skip_duplicates (struct maildir *p, struct maildir **last)
+{
+  /*
+   * Skip ahead to the next non-duplicate message.
+   *
+   * p should never reach NULL, because we couldn't have reached this point unless
+   * there was a message that needed to be parsed.
+   *
+   * the check for p->header_parsed is likely unnecessary since the dupes will most
+   * likely be at the head of the list.  but it is present for consistency with
+   * the check at the top of the for() loop in maildir_delayed_parsing().
+   */
+  while (!p->h || p->header_parsed) {
+    *last = p;
+    p = p->next;
+  }
+  return p;
+}
+
 /* 
  * This function does the second parsing pass
  */
@@ -1011,6 +1030,9 @@ void maildir_delayed_parsing (CONTEXT * ctx, struct maildir **md,
        else
          last->next = p;
        sort = 1;
+
+       p = skip_duplicates(p, &last);
+
        snprintf (fn, sizeof (fn), "%s/%s", ctx->path, p->h->path);
       }
 #endif
@@ -1039,6 +1061,9 @@ void maildir_delayed_parsing (CONTEXT * ctx, struct maildir **md,
       else
        last->next = p;
       sort = 1;
+
+      p = skip_duplicates(p, &last);
+
       snprintf (fn, sizeof (fn), "%s/%s", ctx->path, p->h->path);
     }
 #endif
@@ -1058,7 +1083,7 @@ void maildir_delayed_parsing (CONTEXT * ctx, struct maildir **md,
     FREE (&data);
 #endif
     last = p;
-  }
+   }
 #if USE_HCACHE
   mutt_hcache_close (hc);
 #endif