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 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 4.7.3-1 - update to 4.7.3 (fixes #577960, #603184)