[mc/f12/master] directory handling fixes + advanced chown dialog fix

Jindrich Novy jnovy at fedoraproject.org
Thu Sep 2 15:32:09 UTC 2010


commit b2c5866d3e795653be983e62211b087077cd0f5f
Author: Jindrich Novy <jnovy at redhat.com>
Date:   Thu Sep 2 17:32:03 2010 +0200

    directory handling fixes + advanced chown dialog fix

 mc-achownsegfault.patch |   12 +++++++
 mc-dircopying.patch     |   38 ++++++++++++++++++++++
 mc-dirname.patch        |   82 +++++++++++++++++++++++++++++++++++++++++++++++
 mc.spec                 |   14 +++++++-
 4 files changed, 145 insertions(+), 1 deletions(-)
---
diff --git a/mc-achownsegfault.patch b/mc-achownsegfault.patch
new file mode 100644
index 0000000..6b5fdf0
--- /dev/null
+++ b/mc-achownsegfault.patch
@@ -0,0 +1,12 @@
+diff -up mc-4.7.3/src/achown.c.achownsegfault mc-4.7.3/src/achown.c
+--- mc-4.7.3/src/achown.c.achownsegfault	2010-07-05 20:32:41.000000000 +0200
++++ mc-4.7.3/src/achown.c	2010-09-01 10:41:15.773738062 +0200
+@@ -498,7 +498,7 @@ advanced_chown_callback (Dlg_head *h, Wi
+ 	    if (f_pos > 2)
+ 		break;
+ 	    flag_pos = f_pos * 3 + i;	/* (strchr(ch_perm,parm)-ch_perm); */
+-	    if (((WButton *) h->current)->text.start[(flag_pos % 3)] ==
++	    if (((WButton *) h->current->data)->text.start[(flag_pos % 3)] ==
+ 		'-')
+ 		ch_flags[flag_pos] = '+';
+ 	    else
diff --git a/mc-dircopying.patch b/mc-dircopying.patch
new file mode 100644
index 0000000..485adcc
--- /dev/null
+++ b/mc-dircopying.patch
@@ -0,0 +1,38 @@
+diff --git a/src/file.c b/src/file.c
+index d7eaa46..5c45dcf 100644
+--- a/src/file.c
++++ b/src/file.c
+@@ -2066,28 +2066,21 @@ panel_operate (void *source_panel, FileOperation operation, gboolean force_singl
+             dest_dir = other_panel->cwd;
+         else
+             dest_dir = panel->cwd;
+-
+         /*
+          * Add trailing backslash only when do non-local ops.
+          * It saves user from occasional file renames (when destination
+          * dir is deleted)
+          */
+-        if (force_single || dest_dir[0] == '\0')
+-        {
+-            /* just copy */
+-            dest_dir_ = g_strdup (dest_dir);
+-        }
+-        else if (single_entry)
++        if (!force_single && dest_dir[0] != '\0' && dest_dir[strlen (dest_dir) - 1] != PATH_SEP)
+         {
+-            /* add filename to dest path */
+-            dest_dir_ = g_build_filename (dest_dir, source, (char *) NULL);
++            /* add trailing separator */
++            dest_dir_ = g_strconcat (dest_dir, PATH_SEP_STR, (char *) NULL);
+         }
+         else
+         {
+-            /* add trailing separator */
+-            dest_dir_ = g_strconcat (dest_dir, PATH_SEP_STR, (char *) NULL);
++            /* just copy */
++            dest_dir_ = g_strdup (dest_dir);
+         }
+-
+         if (dest_dir_ == NULL)
+         {
+             file_op_total_context_destroy (tctx);
diff --git a/mc-dirname.patch b/mc-dirname.patch
new file mode 100644
index 0000000..19ee93d
--- /dev/null
+++ b/mc-dirname.patch
@@ -0,0 +1,82 @@
+diff -up mc-4.7.3/lib/search/glob.c.dirname mc-4.7.3/lib/search/glob.c
+--- mc-4.7.3/lib/search/glob.c.dirname	2010-07-05 20:32:41.000000000 +0200
++++ mc-4.7.3/lib/search/glob.c	2010-09-02 17:21:07.174555656 +0200
+@@ -118,14 +118,25 @@ mc_search__translate_replace_glob_to_reg
+ {
+     GString *buff = g_string_new ("");
+     int cnt = '0';
+-
++    gboolean escaped_mode = FALSE;
+     while (*str) {
+ 	char c = *str++;
+ 	switch (c) {
++	case '\\':
++	    if (!escaped_mode)
++	    {
++	        escaped_mode = TRUE;
++	    }
++	    g_string_append_c (buff, c);
++	    continue;
+ 	case '*':
+ 	case '?':
++	    if (!escaped_mode)
++	    {
+ 	    g_string_append_c (buff, '\\');
+ 	    c = ++cnt;
++	    continue;
++	    }
+ 	    break;
+ 	/* breaks copying: mc uses "\0" internally, it must not be changed */
+ 	/*case '\\':*/
+@@ -134,6 +145,7 @@ mc_search__translate_replace_glob_to_reg
+ 	    break;
+ 	}
+ 	g_string_append_c (buff, c);
++	escaped_mode = FALSE;
+     }
+     return buff;
+ }
+@@ -170,7 +182,6 @@ mc_search__run_glob (mc_search_t * lc_mc
+ 
+ /* --------------------------------------------------------------------------------------------- */
+ 
+-
+ GString *
+ mc_search_glob_prepare_replace_str (mc_search_t * lc_mc_search, GString * replace_str)
+ {
+diff -up mc-4.7.3/lib/search/regex.c.dirname mc-4.7.3/lib/search/regex.c
+--- mc-4.7.3/lib/search/regex.c.dirname	2010-07-05 20:32:41.000000000 +0200
++++ mc-4.7.3/lib/search/regex.c	2010-09-02 17:19:26.836553568 +0200
+@@ -320,7 +320,7 @@ mc_search_regex__get_max_num_of_replace_
+     gsize loop;
+     for (loop = 0; loop < len - 1; loop++)
+     {
+-        if (str[loop] == '\\' && (str[loop + 1] & (char) 0xf0) == 0x30 /* 0-9 */ )
++        if (str[loop] == '\\' && g_ascii_isdigit(str[loop + 1]) )
+         {
+             if (strutils_is_char_escaped (str, &str[loop]))
+                 continue;
+@@ -421,9 +421,9 @@ mc_search_regex__process_replace_str (co
+             return -1;
+         }
+ 
+-        if ((*(curr_str + 1) & (char) 0xf0) == 0x30)
++        if ( g_ascii_isdigit(*(curr_str + 1)))
+         {
+-            ret = *(curr_str + 1) - '0';
++            ret = g_ascii_digit_value (*(curr_str + 1));
+             *skip_len = 2;      /* \\ and one digit */
+             return ret;
+         }
+diff -up mc-4.7.3/lib/strutil/strescape.c.dirname mc-4.7.3/lib/strutil/strescape.c
+--- mc-4.7.3/lib/strutil/strescape.c.dirname	2010-07-05 20:32:41.000000000 +0200
++++ mc-4.7.3/lib/strutil/strescape.c	2010-09-02 17:19:26.835554197 +0200
+@@ -39,7 +39,7 @@
+ 
+ static const char ESCAPE_SHELL_CHARS[] = " !#$%()&{}[]`?|<>;*\\\"'";
+ static const char ESCAPE_REGEX_CHARS[] = "^!#$%()&{}[]`?|<>;*.\\";
+-static const char ESCAPE_GLOB_CHARS[]  = "$*\\";
++static const char ESCAPE_GLOB_CHARS[]  = "$*\\?";
+ 
+ /*** file scope functions ************************************************************************/
+ 
diff --git a/mc.spec b/mc.spec
index c94274c..34bb295 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:	1%{?dist}
+Release:	2%{?dist}
 Epoch:		1
 License:	GPLv2
 Group:		System Environment/Shells
@@ -14,6 +14,9 @@ Requires:	dev >= 3.3-3
 
 Patch0:		mc-extensions.patch
 Patch1:		mc-mcviewsegfault.patch
+Patch2:		mc-achownsegfault.patch
+Patch3:		mc-dircopying.patch
+Patch4:		mc-dirname.patch
 
 %description
 Midnight Commander is a visual shell much like a file manager, only
@@ -26,6 +29,9 @@ specific files.
 %setup -q
 %patch0 -p1 -b .extensions
 %patch1 -p1 -b .mcviewsegfault
+%patch2 -p1 -b .achownsegfault
+%patch3 -p1 -b .dircopying
+%patch4 -p1 -b .dirname
 
 %build
 export CFLAGS="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $RPM_OPT_FLAGS"
@@ -87,6 +93,12 @@ rm -rf $RPM_BUILD_ROOT
 %dir %{_libexecdir}/mc/extfs.d
 
 %changelog
+* Wed Sep  1 2010 Jindrich Novy <jnovy at redhat.com> 4.7.3-2
+- fix segfault in advanced chown dialog (#625801)
+- fix broken directory copying, backport from upstream (#624973)
+- backport patch fixing crash while copying files to directory
+  with '?' letters in its name (#576622)
+
 * Fri Jul  9 2010 Jindrich Novy <jnovy at redhat.com> 4.7.3-1
 - update to 4.7.3 (fixes #577960, #603184)
 


More information about the scm-commits mailing list