--- Makefile.am +++ Makefile.am 2010-11-04 13:51:48.000000000 +0000 @@ -71,6 +71,7 @@ EXTRA_DIST = COPYRIGHT GPL OPS OPS.PGP O rfc2231.h rfc822.h rfc3676.h sha1.h sort.h mime.types VERSION prepare \ _regex.h OPS.MIX README.SECURITY remailer.c remailer.h browser.h \ mbyte.h lib.h extlib.c pgpewrap.c smime_keys.pl pgplib.h \ + sidebar.h \ README.SSL smime.h group.h \ muttbug pgppacket.h depcomp ascii.h BEWARE PATCHES patchlist.sh \ ChangeLog mkchangelog.sh mutt_idna.h \ --- Makefile.in +++ Makefile.in 2010-11-04 13:54:41.000000000 +0000 @@ -84,7 +84,7 @@ am_mutt_OBJECTS = addrbook.$(OBJEXT) ali score.$(OBJEXT) send.$(OBJEXT) sendlib.$(OBJEXT) \ signal.$(OBJEXT) sort.$(OBJEXT) status.$(OBJEXT) \ system.$(OBJEXT) thread.$(OBJEXT) charset.$(OBJEXT) \ - history.$(OBJEXT) lib.$(OBJEXT) muttlib.$(OBJEXT) \ + history.$(OBJEXT) lib.$(OBJEXT) sidebar.$(OBJEXT) muttlib.$(OBJEXT) \ editmsg.$(OBJEXT) mbyte.$(OBJEXT) url.$(OBJEXT) \ ascii.$(OBJEXT) crypt-mod.$(OBJEXT) safe_asprintf.$(OBJEXT) am__objects_1 = @@ -359,6 +359,7 @@ mutt_SOURCES = \ rfc822.c rfc1524.c rfc2047.c rfc2231.c rfc3676.c \ score.c send.c sendlib.c signal.c sort.c \ status.c system.c thread.c charset.c history.c lib.c \ + sidebar.c \ muttlib.c editmsg.c mbyte.c \ url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c @@ -389,6 +390,7 @@ EXTRA_DIST = COPYRIGHT GPL OPS OPS.PGP O rfc2231.h rfc822.h rfc3676.h sha1.h sort.h mime.types VERSION prepare \ _regex.h OPS.MIX README.SECURITY remailer.c remailer.h browser.h \ mbyte.h lib.h extlib.c pgpewrap.c smime_keys.pl pgplib.h \ + sidebar.h \ README.SSL smime.h group.h \ muttbug pgppacket.h depcomp ascii.h BEWARE PATCHES patchlist.sh \ ChangeLog mkchangelog.sh mutt_idna.h \ --- buffy.c +++ buffy.c 2010-11-04 13:57:02.000000000 +0000 @@ -520,19 +520,22 @@ int mutt_buffy_check (int force) { case M_MBOX: case M_MMDF: - buffy_mbox_update (tmp); + if (option(OPTSIDEBAR)) + buffy_mbox_update (tmp); if (buffy_mbox_hasnew (tmp, &sb) > 0) BuffyCount++; break; case M_MAILDIR: - buffy_maildir_update (tmp); + if (option(OPTSIDEBAR)) + buffy_maildir_update (tmp); if (buffy_maildir_hasnew (tmp) > 0) BuffyCount++; break; case M_MH: - mh_buffy_update (tmp->path, &tmp->msgcount, &tmp->msg_unread, &tmp->msg_flagged); + if (option(OPTSIDEBAR)) + mh_buffy_update (tmp->path, &tmp->msgcount, &tmp->msg_unread, &tmp->msg_flagged); if ((tmp->new = mh_buffy (tmp->path)) > 0) BuffyCount++; break; --- sidebar.c +++ sidebar.c 2011-06-20 12:30:59.803926815 +0000 @@ -28,6 +28,7 @@ #include "sidebar.h" #include "buffy.h" #include +#include #include "keymap.h" #include @@ -80,36 +81,45 @@ void calc_boundaries (int menu) } } +static char sidebar_buffer[LINE_MAX]; char *make_sidebar_entry(char *box, int size, int new, int flagged) { - static char *entry = 0; - char *c; - int i = 0; - int delim_len = strlen(SidebarDelim); + char *entry; + size_t i = 0; + size_t delim_len = strlen(NONULL(SidebarDelim)); + size_t width = sizeof(sidebar_buffer) - 1; + + entry = &sidebar_buffer[0]; + if (SidebarWidth - delim_len + 1 > width || strlen(box) + 1 > width) + return NONULL(SidebarDelim); - c = realloc(entry, SidebarWidth - delim_len + 2); - if ( c ) entry = c; entry[SidebarWidth - delim_len + 1] = 0; for (; i < SidebarWidth - delim_len + 1; entry[i++] = ' ' ); i = strlen(box); strncpy( entry, box, i < (SidebarWidth - delim_len + 1) ? i : (SidebarWidth - delim_len + 1) ); if (size == -1) - sprintf(entry + SidebarWidth - delim_len - 3, "?"); + snprintf(entry + SidebarWidth - delim_len - 3, width, "?"); else if ( new ) { if (flagged > 0) { - sprintf( + snprintf( entry + SidebarWidth - delim_len - 5 - quick_log10(size) - quick_log10(new) - quick_log10(flagged), + width, "% d(%d)[%d]", size, new, flagged); } else { - sprintf( + snprintf( entry + SidebarWidth - delim_len - 3 - quick_log10(size) - quick_log10(new), + width, "% d(%d)", size, new); } } else if (flagged > 0) { - sprintf( entry + SidebarWidth - delim_len - 3 - quick_log10(size) - quick_log10(flagged), "% d[%d]", size, flagged); + snprintf(entry + SidebarWidth - delim_len - 3 - quick_log10(size) - quick_log10(flagged), + width, + "% d[%d]", size, flagged); } else { - sprintf( entry + SidebarWidth - delim_len - 1 - quick_log10(size), "% d", size); + snprintf(entry + SidebarWidth - delim_len - 1 - quick_log10(size), + width, + "% d", size); } return entry; } @@ -136,6 +146,7 @@ void set_curbuffy(char buf[LONG_STRING]) int draw_sidebar(int menu) { + char folder_buffer[LINE_MAX]; int lines = option(OPTHELP) ? 1 : 0; lines += option(OPTSTATUSONTOP) ? 1 : 0; @@ -143,10 +154,11 @@ int draw_sidebar(int menu) { #ifndef USE_SLANG_CURSES attr_t attrs; #endif - short delim_len = strlen(SidebarDelim); + short delim_len = strlen(NONULL(SidebarDelim)); short color_pair; + char *maildir = NONULL(Maildir); - static bool initialized = false; + static bool initialized /* = false*/; static int prev_show_value; static short saveSidebarWidth; @@ -170,7 +182,7 @@ int draw_sidebar(int menu) { } -// if ( SidebarWidth == 0 ) return 0; +/* if ( SidebarWidth == 0 ) return 0; */ if (SidebarWidth > 0 && option (OPTSIDEBAR) && delim_len >= SidebarWidth) { unset_option (OPTSIDEBAR); @@ -229,6 +241,32 @@ int draw_sidebar(int menu) { SETCOLOR(MT_COLOR_NORMAL); for ( ; tmp && lines < LINES-1 - (menu != MENU_PAGER || option(OPTSTATUSONTOP)); tmp = tmp->next ) { + short maildir_is_prefix = 0; + int sidebar_folder_depth; + char *sidebar_folder_name; + char *safe_path; + char *base_name; + + if ( !tmp->path || *tmp->path == '\0' ) { + move( lines, 0 ); + lines++; + continue; + } + + safe_path = strdupa(tmp->path); + if ( !safe_path ) { + move( lines, 0 ); + lines++; + continue; + } + + base_name = basename(safe_path); + if ( !base_name ) { + move( lines, 0 ); + lines++; + continue; + } + if ( tmp == CurBuffy ) SETCOLOR(MT_COLOR_INDICATOR); else if ( tmp->msg_unread > 0 ) @@ -244,35 +282,36 @@ int draw_sidebar(int menu) { tmp->msgcount = Context->msgcount; tmp->msg_flagged = Context->flagged; } - // check whether Maildir is a prefix of the current folder's path - short maildir_is_prefix = 0; - if ( (strlen(tmp->path) > strlen(Maildir)) && - (strncmp(Maildir, tmp->path, strlen(Maildir)) == 0) ) + /* check whether Maildir is a prefix of the current folder's path */ + if ( (strlen(tmp->path) > strlen(maildir)) && + (strncmp(maildir, tmp->path, strlen(maildir)) == 0) ) maildir_is_prefix = 1; - // calculate depth of current folder and generate its display name with indented spaces - int sidebar_folder_depth = 0; - char *sidebar_folder_name; - sidebar_folder_name = basename(tmp->path); + /* calculate depth of current folder and generate its display name with indented spaces */ + sidebar_folder_name = base_name; + sidebar_folder_depth = 0; if ( maildir_is_prefix ) { char *tmp_folder_name; int i; - tmp_folder_name = tmp->path + strlen(Maildir); - for (i = 0; i < strlen(tmp->path) - strlen(Maildir); i++) { + tmp_folder_name = tmp->path + strlen(maildir); + for (i = 0; i < strlen(tmp->path) - strlen(maildir); i++) { if (tmp_folder_name[i] == '/') sidebar_folder_depth++; } if (sidebar_folder_depth > 0) { - sidebar_folder_name = malloc(strlen(basename(tmp->path)) + sidebar_folder_depth + 1); + if (sidebar_folder_depth + strlen(base_name) + 1 > sizeof(folder_buffer)) { + move( lines, 0 ); + lines++; + continue; + } + sidebar_folder_name = &folder_buffer[0]; for (i=0; i < sidebar_folder_depth; i++) sidebar_folder_name[i]=' '; sidebar_folder_name[i]=0; - strncat(sidebar_folder_name, basename(tmp->path), strlen(basename(tmp->path)) + sidebar_folder_depth); + strncat(sidebar_folder_name, base_name, strlen(base_name) + sidebar_folder_depth); } } printw( "%.*s", SidebarWidth - delim_len + 1, make_sidebar_entry(sidebar_folder_name, tmp->msgcount, tmp->msg_unread, tmp->msg_flagged)); - if (sidebar_folder_depth > 0) - free(sidebar_folder_name); lines++; } SETCOLOR(MT_COLOR_NORMAL);