[mc] fix segfault in Replace dialog, show proper contents in history
Jindrich Novy
jnovy at fedoraproject.org
Fri Sep 3 07:45:09 UTC 2010
commit 92144a5e41128e807c1421856815b08b260733bd
Author: Jindrich Novy <jnovy at redhat.com>
Date: Fri Sep 3 09:44:56 2010 +0200
fix segfault in Replace dialog, show proper contents in history
mc-historyfix.patch | 30 ++++++++++++++
mc-replacefix.patch | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++
mc.spec | 10 ++++-
3 files changed, 149 insertions(+), 1 deletions(-)
---
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 <jnovy at redhat.com> 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 <jnovy at redhat.com> 4.7.3-3
- fix broken directory copying, backport from upstream (#624973)
- backport patch fixing crash while copying files to directory
More information about the scm-commits
mailing list