1
0
forked from pool/mutt
mutt/mutt-1.5.21.sidebar-fix.dif
2011-01-31 13:36:16 +00:00

246 lines
8.5 KiB
Plaintext

--- 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-01-31 12:06:41.571925769 +0000
@@ -28,6 +28,7 @@
#include "sidebar.h"
#include "buffy.h"
#include <libgen.h>
+#include <limits.h>
#include "keymap.h"
#include <stdbool.h>
@@ -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,15 +146,17 @@ void set_curbuffy(char buf[LONG_STRING])
int draw_sidebar(int menu) {
+ char folder_buffer[LINE_MAX];
int lines = option(OPTHELP) ? 1 : 0;
BUFFY *tmp;
#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;
@@ -168,7 +180,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);
@@ -226,6 +238,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 )
@@ -241,35 +279,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);