From: Pietro Cerutti Date: Thu, 29 Aug 2019 09:46:29 +0000 (+0000) Subject: Make sure Progress doesn't reference an out-of-scope buffer X-Git-Tag: 2019-10-25~72 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=de4a116e55fa6d16916157fc6f815a400d572883;p=neomutt Make sure Progress doesn't reference an out-of-scope buffer Cleanup mutt_progress_init's callers Fixes: #1819 --- diff --git a/index.c b/index.c index 115be7ef6..29f72c098 100644 --- a/index.c +++ b/index.c @@ -2058,10 +2058,8 @@ int mutt_index_menu(void) if (!Context->mailbox->quiet) { - char msgbuf[256]; - snprintf(msgbuf, sizeof(msgbuf), _("Update tags...")); - mutt_progress_init(&progress, msgbuf, MUTT_PROGRESS_MSG, 1, - Context->mailbox->msg_tagged); + mutt_progress_init(&progress, _("Update tags..."), MUTT_PROGRESS_MSG, + 1, Context->mailbox->msg_tagged); } #ifdef USE_NOTMUCH diff --git a/maildir/shared.c b/maildir/shared.c index 2c90b84b1..f57cdac5d 100644 --- a/maildir/shared.c +++ b/maildir/shared.c @@ -802,13 +802,13 @@ int mh_read_dir(struct Mailbox *m, const char *subdir) struct Maildir *md = NULL; struct MhSequences mhs = { 0 }; struct Maildir **last = NULL; - char msgbuf[256]; struct Progress progress; if (!m->quiet) { - snprintf(msgbuf, sizeof(msgbuf), _("Scanning %s..."), mailbox_path(m)); - mutt_progress_init(&progress, msgbuf, MUTT_PROGRESS_MSG, C_ReadInc, 0); + char msg[PATH_MAX]; + snprintf(msg, sizeof(msg), _("Scanning %s..."), mailbox_path(m)); + mutt_progress_init(&progress, msg, MUTT_PROGRESS_MSG, C_ReadInc, 0); } struct MaildirMboxData *mdata = maildir_mdata_get(m); @@ -829,8 +829,9 @@ int mh_read_dir(struct Mailbox *m, const char *subdir) if (!m->quiet) { - snprintf(msgbuf, sizeof(msgbuf), _("Reading %s..."), mailbox_path(m)); - mutt_progress_init(&progress, msgbuf, MUTT_PROGRESS_MSG, C_ReadInc, count); + char msg[PATH_MAX]; + snprintf(msg, sizeof(msg), _("Reading %s..."), mailbox_path(m)); + mutt_progress_init(&progress, msg, MUTT_PROGRESS_MSG, C_ReadInc, count); } maildir_delayed_parsing(m, &md, &progress); @@ -1691,7 +1692,6 @@ int mh_mbox_sync(struct Mailbox *m, int *index_hint) int i, j; header_cache_t *hc = NULL; - char msgbuf[PATH_MAX + 64]; struct Progress progress; if (m->magic == MUTT_MH) @@ -1709,8 +1709,9 @@ int mh_mbox_sync(struct Mailbox *m, int *index_hint) if (!m->quiet) { - snprintf(msgbuf, sizeof(msgbuf), _("Writing %s..."), mailbox_path(m)); - mutt_progress_init(&progress, msgbuf, MUTT_PROGRESS_MSG, C_WriteInc, m->msg_count); + char msg[PATH_MAX]; + snprintf(msg, sizeof(msg), _("Writing %s..."), mailbox_path(m)); + mutt_progress_init(&progress, msg, MUTT_PROGRESS_MSG, C_WriteInc, m->msg_count); } for (i = 0; i < m->msg_count; i++) diff --git a/mbox/mbox.c b/mbox/mbox.c index d243d48ec..0f008cbed 100644 --- a/mbox/mbox.c +++ b/mbox/mbox.c @@ -212,9 +212,9 @@ static int mmdf_parse_mailbox(struct Mailbox *m) if (!m->quiet) { - char msgbuf[256]; - snprintf(msgbuf, sizeof(msgbuf), _("Reading %s..."), mailbox_path(m)); - mutt_progress_init(&progress, msgbuf, MUTT_PROGRESS_MSG, C_ReadInc, 0); + char msg[PATH_MAX]; + snprintf(msg, sizeof(msg), _("Reading %s..."), mailbox_path(m)); + mutt_progress_init(&progress, msg, MUTT_PROGRESS_MSG, C_ReadInc, 0); } while (true) @@ -378,9 +378,9 @@ static int mbox_parse_mailbox(struct Mailbox *m) if (!m->quiet) { - char msgbuf[256]; - snprintf(msgbuf, sizeof(msgbuf), _("Reading %s..."), mailbox_path(m)); - mutt_progress_init(&progress, msgbuf, MUTT_PROGRESS_MSG, C_ReadInc, 0); + char msg[PATH_MAX]; + snprintf(msg, sizeof(msg), _("Reading %s..."), mailbox_path(m)); + mutt_progress_init(&progress, msg, MUTT_PROGRESS_MSG, C_ReadInc, 0); } if (!m->emails) @@ -1130,7 +1130,6 @@ static int mbox_mbox_sync(struct Mailbox *m, int *index_hint) struct MUpdate *old_offset = NULL; FILE *fp = NULL; struct Progress progress; - char msgbuf[PATH_MAX + 64]; /* sort message by their position in the mailbox on disk */ if (C_Sort != SORT_ORDER) @@ -1224,8 +1223,9 @@ static int mbox_mbox_sync(struct Mailbox *m, int *index_hint) if (!m->quiet) { - snprintf(msgbuf, sizeof(msgbuf), _("Writing %s..."), mailbox_path(m)); - mutt_progress_init(&progress, msgbuf, MUTT_PROGRESS_MSG, C_WriteInc, m->msg_count); + char msg[PATH_MAX]; + snprintf(msg, sizeof(msg), _("Writing %s..."), mailbox_path(m)); + mutt_progress_init(&progress, msg, MUTT_PROGRESS_MSG, C_WriteInc, m->msg_count); } for (i = first, j = 0; i < m->msg_count; i++) diff --git a/notmuch/mutt_notmuch.c b/notmuch/mutt_notmuch.c index 6bd769e3c..ccbef66a9 100644 --- a/notmuch/mutt_notmuch.c +++ b/notmuch/mutt_notmuch.c @@ -854,12 +854,9 @@ static void progress_update(struct Mailbox *m, notmuch_query_t *q) if (!mdata->progress_ready && q) { - static char msg[256]; - snprintf(msg, sizeof(msg), _("Reading messages...")); - // The total mail count is in oldmsgcount, so use that instead of recounting. - mutt_progress_init(&mdata->progress, msg, MUTT_PROGRESS_MSG, C_ReadInc, - mdata->oldmsgcount); + mutt_progress_init(&mdata->progress, _("Reading messages..."), + MUTT_PROGRESS_MSG, C_ReadInc, mdata->oldmsgcount); mdata->progress_ready = true; } @@ -2362,10 +2359,10 @@ static int nm_mbox_sync(struct Mailbox *m, int *index_hint) if (!m->quiet) { - char msgbuf[PATH_MAX + 64]; /* all is in this function so we don't use data->progress here */ - snprintf(msgbuf, sizeof(msgbuf), _("Writing %s..."), mailbox_path(m)); - mutt_progress_init(&progress, msgbuf, MUTT_PROGRESS_MSG, C_WriteInc, m->msg_count); + char msg[PATH_MAX]; + snprintf(msg, sizeof(msg), _("Writing %s..."), mailbox_path(m)); + mutt_progress_init(&progress, msg, MUTT_PROGRESS_MSG, C_WriteInc, m->msg_count); } header_cache_t *h = nm_hcache_open(m); diff --git a/progress.c b/progress.c index 5563769ca..da3956ec3 100644 --- a/progress.c +++ b/progress.c @@ -107,7 +107,7 @@ static void message_bar(int percent, const char *fmt, ...) /** * mutt_progress_init - Set up a progress bar * @param progress Progress bar - * @param msg Message to display + * @param msg Message to display; this is copied into the Progress object * @param flags Flags, e.g. #MUTT_PROGRESS_SIZE * @param inc Increments to display (0 disables updates) * @param size Total size of expected file / traffic @@ -125,7 +125,7 @@ void mutt_progress_init(struct Progress *progress, const char *msg, memset(progress, 0, sizeof(struct Progress)); progress->inc = inc; progress->flags = flags; - progress->msg = msg; + mutt_str_strfcpy(progress->msg, msg, sizeof(progress->msg)); progress->size = size; if (progress->size != 0) { diff --git a/progress.h b/progress.h index 819f799ce..b025bd8df 100644 --- a/progress.h +++ b/progress.h @@ -38,7 +38,7 @@ struct Progress { unsigned short inc; unsigned short flags; - const char *msg; + char msg[1024]; long pos; size_t size; unsigned int timestamp;