[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