diff --git a/mc-historyfix.patch b/mc-historyfix.patch new file mode 100644 index 0000000..3774cf1 --- /dev/null +++ b/mc-historyfix.patch @@ -0,0 +1,30 @@ +diff --git a/src/widget.c b/src/widget.c +index 280575a..bf052cd 100644 +--- a/src/widget.c ++++ b/src/widget.c +@@ -1492,12 +1492,12 @@ show_hist (GList ** history, Widget * widget) + entry->text = NULL; + } + +- destroy_dlg (query_dlg); +- + /* restore history direction */ + if (query_dlg->y < widget->y) + z = g_list_reverse (z); + ++ destroy_dlg (query_dlg); ++ + g_list_foreach (*history, (GFunc) g_free, NULL); + g_list_free (*history); + *history = g_list_last (z); +@@ -2751,9 +2751,7 @@ listbox_key (WListbox * l, int key) + static inline void + listbox_destroy (WListbox * l) + { +- /* don't delete list in modifable listbox */ +- if (!l->deletable) +- listbox_remove_list (l); ++ listbox_remove_list (l); + } + + static cb_ret_t diff --git a/mc-replacefix.patch b/mc-replacefix.patch new file mode 100644 index 0000000..22e7751 --- /dev/null +++ b/mc-replacefix.patch @@ -0,0 +1,110 @@ +diff --git a/src/editor/editcmd.c b/src/editor/editcmd.c +index 0e8bb1d..f568bdf 100644 +--- a/src/editor/editcmd.c ++++ b/src/editor/editcmd.c +@@ -1785,7 +1785,6 @@ edit_replace_cmd (WEdit * edit, int again) + + if ((edit->search_start >= 0) && (edit->search_start < edit->last_byte)) + { +- gboolean replace_yes; + gsize i; + + edit->found_start = edit->search_start; +@@ -1794,11 +1793,11 @@ edit_replace_cmd (WEdit * edit, int again) + edit_cursor_move (edit, edit->search_start - edit->curs1); + edit_scroll_screen_over_cursor (edit); + +- replace_yes = TRUE; +- + if (edit->replace_mode == 0) + { + int l; ++ int prompt; ++ + l = edit->curs_row - edit->num_widget_lines / 3; + if (l > 0) + edit_scroll_downward (edit, l); +@@ -1814,52 +1813,49 @@ edit_replace_cmd (WEdit * edit, int again) + /* and prompt 2/3 down */ + disp1 = edit_replace_cmd__conv_to_display (saved1); + disp2 = edit_replace_cmd__conv_to_display (saved2); ++ prompt = editcmd_dialog_replace_prompt_show (edit, disp1, disp2, -1, -1); ++ g_free (disp1); ++ g_free (disp2); + +- switch (editcmd_dialog_replace_prompt_show (edit, disp1, disp2, -1, -1)) +- { +- case B_ENTER: +- replace_yes = TRUE; +- break; +- case B_SKIP_REPLACE: +- replace_yes = FALSE; +- break; +- case B_REPLACE_ALL: ++ if (prompt == B_REPLACE_ALL) + edit->replace_mode = 1; +- break; +- case B_CANCEL: +- replace_yes = FALSE; ++ else if (prompt == B_SKIP_REPLACE) ++ { ++ if (edit_search_options.backwards) ++ edit->search_start--; ++ else ++ edit->search_start++; ++ continue; /* loop */ ++ } ++ else if (prompt == B_CANCEL) ++ { + edit->replace_mode = -1; +- break; ++ break; /* loop */ + } +- g_free (disp1); +- g_free (disp2); + } + +- if (replace_yes) ++ /* don't process string each time */ ++ if (tmp_str == NULL) + { +- /* don't process string each time */ +- if (tmp_str == NULL) +- { +- tmp_str = g_string_new (input2); +- repl_str = mc_search_prepare_replace_str (edit->search, tmp_str); ++ tmp_str = g_string_new (input2); ++ repl_str = mc_search_prepare_replace_str (edit->search, tmp_str); + +- if (edit->search->error != MC_SEARCH_E_OK) +- { +- edit_error_dialog (_("Replace"), edit->search->error_str); +- break; +- } ++ if (edit->search->error != MC_SEARCH_E_OK) ++ { ++ edit_error_dialog (_("Replace"), edit->search->error_str); ++ break; + } ++ } + +- /* delete then insert new */ +- for (i = 0; i < len; i++) +- edit_delete (edit, 1); ++ /* delete then insert new */ ++ for (i = 0; i < len; i++) ++ edit_delete (edit, 1); + +- for (i = 0; i < repl_str->len; i++) +- edit_insert (edit, repl_str->str[i]); ++ for (i = 0; i < repl_str->len; i++) ++ edit_insert (edit, repl_str->str[i]); + +- edit->found_len = repl_str->len; +- times_replaced++; +- } ++ edit->found_len = repl_str->len; ++ times_replaced++; + + /* so that we don't find the same string again */ + if (edit_search_options.backwards) diff --git a/mc.spec b/mc.spec index 43b2c3d..bb78ca2 100644 --- a/mc.spec +++ b/mc.spec @@ -1,7 +1,7 @@ Summary: User-friendly text console file manager and visual shell Name: mc Version: 4.7.3 -Release: 3%{?dist} +Release: 4%{?dist} Epoch: 1 License: GPLv2 Group: System Environment/Shells @@ -17,6 +17,8 @@ Patch1: mc-mcviewsegfault.patch Patch2: mc-achownsegfault.patch Patch3: mc-dircopying.patch Patch4: mc-dirname.patch +Patch5: mc-replacefix.patch +Patch6: mc-historyfix.patch %description Midnight Commander is a visual shell much like a file manager, only @@ -32,6 +34,8 @@ specific files. %patch2 -p1 -b .achownsegfault %patch3 -p1 -b .dircopying %patch4 -p1 -b .dirname +%patch5 -p1 -b .replacefix +%patch6 -p1 -b .historyfix %build export CFLAGS="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $RPM_OPT_FLAGS" @@ -93,6 +97,10 @@ rm -rf $RPM_BUILD_ROOT %dir %{_libexecdir}/mc/extfs.d %changelog +* Fri Sep 3 2010 Jindrich Novy 4.7.3-4 +- fix segfault when pressing Cancel in Replace String dialog (#629847) +- show proper contents in history and fix memleak (ticket #2299) + * Thu Sep 2 2010 Jindrich Novy 4.7.3-3 - fix broken directory copying, backport from upstream (#624973) - backport patch fixing crash while copying files to directory