X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/17932f7aea1c21cf17738f47996345d9d0a6ce51..ec173fd2c:/sbr/folder_read.c?ds=inline diff --git a/sbr/folder_read.c b/sbr/folder_read.c index 02271bc6..18a9ec14 100644 --- a/sbr/folder_read.c +++ b/sbr/folder_read.c @@ -1,14 +1,17 @@ - -/* - * folder_read.c -- initialize folder structure and read folder +/* folder_read.c -- initialize folder structure and read folder * * This code is Copyright (c) 2002, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for * complete copyright information. */ -#include -#include +#include "h/mh.h" +#include "seq_read.h" +#include "m_atoi.h" +#include "folder_read.h" +#include "error.h" +#include "h/utils.h" +#include "m_maildir.h" /* We allocate the `mi' array 1024 elements at a time */ #define NUMMSGS 1024 @@ -25,11 +28,12 @@ struct msgs * folder_read (char *name, int lockflag) { - int msgnum, prefix_len, len, *mi; + int msgnum, len, *mi; struct msgs *mp; - struct stat st; struct dirent *dp; DIR *dd; + struct bvector *v; + size_t i; name = m_mailpath (name); if (!(dd = opendir (name))) { @@ -37,14 +41,8 @@ folder_read (char *name, int lockflag) return NULL; } - if (stat (name, &st) == -1) { - free (name); - return NULL; - } - /* Allocate the main structure for folder information */ - mp = (struct msgs *) mh_xmalloc ((size_t) sizeof(*mp)); - + NEW(mp); clear_folder_flags (mp); mp->foldpath = name; mp->lowmsg = 0; @@ -59,14 +57,13 @@ folder_read (char *name, int lockflag) if (access (name, W_OK) == -1) set_readonly (mp); - prefix_len = strlen(BACKUP_PREFIX); /* * Allocate a temporary place to record the * name of the messages in this folder. */ len = NUMMSGS; - mi = (int *) mh_xmalloc ((size_t) (len * sizeof(*mi))); + mi = mh_xmalloc ((size_t) (len * sizeof(*mi))); while ((dp = readdir (dd))) { if ((msgnum = m_atoi (dp->d_name)) && msgnum > 0) { @@ -76,7 +73,7 @@ folder_read (char *name, int lockflag) */ if (mp->nummsg >= len) { len += NUMMSGS; - mi = (int *) mh_xrealloc (mi, (size_t) (len * sizeof(*mi))); + mi = mh_xrealloc (mi, (size_t) (len * sizeof(*mi))); } /* Check if this is the first message we've seen */ @@ -105,7 +102,7 @@ folder_read (char *name, int lockflag) default: /* skip any files beginning with backup prefix */ - if (!strncmp (dp->d_name, BACKUP_PREFIX, prefix_len)) + if (has_prefix(dp->d_name, BACKUP_PREFIX)) continue; /* skip the LINK file */ @@ -129,16 +126,25 @@ folder_read (char *name, int lockflag) /* mp->hghoff = max (mp->hghmsg, 1); */ /* - * Allocate space for status of each message. + * If for some reason hghoff < lowoff (like we got an integer overflow) + * the complain about this now. */ - mp->msgstats = mh_xmalloc (MSGSTATSIZE(mp, mp->lowoff, mp->hghoff)); + + if (mp->hghoff < mp->lowoff) { + die("Internal failure: high message limit < low message " + "limit; possible overflow?"); + } /* - * Clear all the flag bits for all the message - * status entries we just allocated. + * Allocate space for status of each message. */ - for (msgnum = mp->lowoff; msgnum <= mp->hghoff; msgnum++) - clear_msg_flags (mp, msgnum); + mp->num_msgstats = MSGSTATNUM (mp->lowoff, mp->hghoff); + mp->msgstats = mh_xmalloc (MSGSTATSIZE(mp)); + for (i = 0, v = mp->msgstats; i < mp->num_msgstats; ++i, ++v) { + bvector_init(v); + } + + mp->msgattrs = svector_create (0); /* * Scan through the array of messages we've seen and @@ -153,7 +159,15 @@ folder_read (char *name, int lockflag) /* * Read and initialize the sequence information. */ - seq_read (mp, lockflag); + if (seq_read (mp, lockflag) == NOTOK) { + char seqfile[PATH_MAX]; + + /* Failed to lock sequence file. */ + snprintf (seqfile, sizeof(seqfile), "%s/%s", mp->foldpath, mh_seq); + advise (seqfile, "failed to lock"); + + return NULL; + } return mp; }