diff --git a/mutt-1.5.21.sidebar-fix.dif b/mutt-1.5.21.sidebar-fix.dif index e1ac821..f70b0b3 100644 --- a/mutt-1.5.21.sidebar-fix.dif +++ b/mutt-1.5.21.sidebar-fix.dif @@ -1,5 +1,5 @@ --- Makefile.am -+++ Makefile.am 2010-11-04 13:51:48.432426391 +0000 ++++ 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 \ @@ -9,7 +9,7 @@ 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.299925329 +0000 ++++ 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) \ @@ -36,7 +36,7 @@ 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.163926692 +0000 ++++ buffy.c 2010-11-04 13:57:02.000000000 +0000 @@ -520,19 +520,22 @@ int mutt_buffy_check (int force) { case M_MBOX: @@ -63,3 +63,183 @@ 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 ++#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,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); diff --git a/mutt.changes b/mutt.changes index 608e514..b8132e6 100644 --- a/mutt.changes +++ b/mutt.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Mon Jan 31 14:30:26 CET 2011 - werner@suse.de + +- Fix the orther sidebar patch as it is broken with MALLOC_CHECK=1 + now static buffers are used instead (re)alloced arrays. + ------------------------------------------------------------------- Wed Jan 26 12:46:10 UTC 2011 - gber@opensuse.org