X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/1691e80890e5d8ba258c51c214a3e91880e1db2b..7bb5dd523c67aabb2aa9cc623d69bc380862fc77:/sbr/folder_read.c diff --git a/sbr/folder_read.c b/sbr/folder_read.c index 0d012932..e4bac904 100644 --- a/sbr/folder_read.c +++ b/sbr/folder_read.c @@ -2,10 +2,13 @@ /* * folder_read.c -- initialize folder structure and read folder * - * $Id$ + * 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 /* We allocate the `mi' array 1024 elements at a time */ #define NUMMSGS 1024 @@ -20,13 +23,14 @@ */ struct msgs * -folder_read (char *name) +folder_read (char *name, int lockflag) { int msgnum, prefix_len, len, *mi; struct msgs *mp; - struct stat st; struct dirent *dp; DIR *dd; + bvector_t *v; + size_t i; name = m_mailpath (name); if (!(dd = opendir (name))) { @@ -34,15 +38,8 @@ folder_read (char *name) return NULL; } - if (stat (name, &st) == -1) { - free (name); - return NULL; - } - /* Allocate the main structure for folder information */ - if (!(mp = (struct msgs *) malloc ((size_t) sizeof(*mp)))) - adios (NULL, "unable to allocate folder storage"); - + NEW(mp); clear_folder_flags (mp); mp->foldpath = name; mp->lowmsg = 0; @@ -52,8 +49,10 @@ folder_read (char *name) mp->hghsel = 0; mp->numsel = 0; mp->nummsg = 0; + mp->seqhandle = NULL; + mp->seqname = NULL; - if (access (name, W_OK) == -1 || st.st_uid != getuid()) + if (access (name, W_OK) == -1) set_readonly (mp); prefix_len = strlen(BACKUP_PREFIX); @@ -62,21 +61,17 @@ folder_read (char *name) * name of the messages in this folder. */ len = NUMMSGS; - if (!(mi = (int *) malloc ((size_t) (len * sizeof(*mi))))) - adios (NULL, "unable to allocate storage"); + mi = (int *) mh_xmalloc ((size_t) (len * sizeof(*mi))); while ((dp = readdir (dd))) { - if ((msgnum = m_atoi (dp->d_name))) { + if ((msgnum = m_atoi (dp->d_name)) && msgnum > 0) { /* * Check if we need to allocate more * temporary elements for message names. */ if (mp->nummsg >= len) { len += NUMMSGS; - if (!(mi = (int *) realloc (mi, - (size_t) (len * sizeof(*mi))))) { - adios (NULL, "unable to allocate storage"); - } + mi = (int *) mh_xrealloc (mi, (size_t) (len * sizeof(*mi))); } /* Check if this is the first message we've seen */ @@ -101,9 +96,6 @@ folder_read (char *name) switch (dp->d_name[0]) { case '.': case ',': -#ifdef MHE - case '+': -#endif /* MHE */ continue; default: @@ -131,11 +123,26 @@ folder_read (char *name) /* for testing, allocate minimal necessary space */ /* mp->hghoff = max (mp->hghmsg, 1); */ + /* + * If for some reason hghoff < lowoff (like we got an integer overflow) + * the complain about this now. + */ + + if (mp->hghoff < mp->lowoff) { + adios(NULL, "Internal failure: high message limit < low message " + "limit; possible overflow?"); + } + /* * Allocate space for status of each message. */ - if (!(mp->msgstats = malloc (MSGSTATSIZE(mp, mp->lowoff, mp->hghoff)))) - adios (NULL, "unable to allocate storage for msgstats"); + 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) { + *v = bvector_create (0); + } + + mp->msgattrs = svector_create (0); /* * Clear all the flag bits for all the message @@ -157,7 +164,15 @@ folder_read (char *name) /* * Read and initialize the sequence information. */ - seq_read (mp); + 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; }