File mutt-1.5.21.sidebar-fix.dif of Package mutt.import4421

--- 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);