use memset to clear the msgstats in folder_realloc
[mmh] / sbr / folder_realloc.c
index 47b9281..52c3647 100644 (file)
@@ -46,6 +46,12 @@ folder_realloc(struct msgs *mp, int lo, int hi)
                ** just realloc the message status array.
                */
                mp->msgstats = mh_xrealloc(mp->msgstats, MSGSTATSIZE(mp, lo, hi));
                ** just realloc the message status array.
                */
                mp->msgstats = mh_xrealloc(mp->msgstats, MSGSTATSIZE(mp, lo, hi));
+               /*
+               ** Clear the newly allocated msg flag space. The lowoff and
+               ** hghoff are the old messagenumber range. So the calculation
+               ** of the first new element has to subtract lowoff.
+               */
+               memset(mp->msgstats + mp->hghoff - lo + 1, 0, hi - mp->hghoff);
        } else {
                /*
                ** We are changing the offset of the message status
        } else {
                /*
                ** We are changing the offset of the message status
@@ -54,7 +60,7 @@ folder_realloc(struct msgs *mp, int lo, int hi)
                seqset_t *tmpstats;
 
                /* first allocate the new message status space */
                seqset_t *tmpstats;
 
                /* first allocate the new message status space */
-               tmpstats = mh_xmalloc(MSGSTATSIZE(mp, lo, hi));
+               tmpstats = mh_xcalloc(MSGSTATSIZE(mp, lo, hi), 1);
 
                /* then copy messages status array with shift */
                if (mp->nummsg > 0) {
 
                /* then copy messages status array with shift */
                if (mp->nummsg > 0) {
@@ -62,27 +68,12 @@ folder_realloc(struct msgs *mp, int lo, int hi)
                                tmpstats[msgnum - lo] = mp->msgstats[msgnum - mp->lowoff];
                        }
                }
                                tmpstats[msgnum - lo] = mp->msgstats[msgnum - mp->lowoff];
                        }
                }
-               free(mp->msgstats);
+               mh_free0(&(mp->msgstats));
                mp->msgstats = tmpstats;
        }
 
        mp->lowoff = lo;
        mp->hghoff = hi;
 
                mp->msgstats = tmpstats;
        }
 
        mp->lowoff = lo;
        mp->hghoff = hi;
 
-       /*
-       ** Clear all the flags for entries outside
-       ** the current message range for this folder.
-       */
-       if (mp->nummsg > 0) {
-               for (msgnum = mp->lowoff; msgnum < mp->lowmsg; msgnum++)
-                       clear_msg_flags(mp, msgnum);
-               for (msgnum = mp->hghmsg + 1; msgnum <= mp->hghoff; msgnum++)
-                       clear_msg_flags(mp, msgnum);
-       } else {
-               /* no messages, so clear entire range */
-               for (msgnum = mp->lowoff; msgnum <= mp->hghoff; msgnum++)
-                       clear_msg_flags(mp, msgnum);
-       }
-
        return mp;
 }
        return mp;
 }