X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/892a81dbb7c632d80fb528609f5abbd3b7ba43c6..cf57870921b26703aad420c6741c524b33736ff1:/sbr/folder_read.c diff --git a/sbr/folder_read.c b/sbr/folder_read.c index 4a9f7fba..1e95a92b 100644 --- a/sbr/folder_read.c +++ b/sbr/folder_read.c @@ -25,7 +25,7 @@ struct msgs * folder_read (char *name, int lockflag) { - int msgnum, prefix_len, len, *mi; + int msgnum, len, *mi; struct msgs *mp; struct dirent *dp; DIR *dd; @@ -39,8 +39,7 @@ folder_read (char *name, int lockflag) } /* 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; @@ -55,7 +54,6 @@ 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 @@ -101,7 +99,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 */ @@ -124,6 +122,16 @@ folder_read (char *name, int lockflag) /* 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. */ @@ -155,7 +163,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; }