Fixed patterns escaping of wild filenames (such as \1, ${1}, \U, etc).
Signed-off-by: Slava Zanko <slavazanko@gmail.com>
Этот коммит содержится в:
родитель
a58a14c357
Коммит
bbb800530c
@ -863,7 +863,7 @@ file_mask_dialog (FileOpContext *ctx, FileOperation operation, const char *text,
|
||||
{
|
||||
int source_easy_patterns = easy_patterns;
|
||||
char *source_mask, *orig_mask, *dest_dir, *tmpdest;
|
||||
char *def_text_secure;
|
||||
char *def_text_secure, *def_text_secure2;
|
||||
struct stat buf;
|
||||
int val;
|
||||
QuickDialog Quick_input;
|
||||
@ -881,6 +881,10 @@ file_mask_dialog (FileOpContext *ctx, FileOperation operation, const char *text,
|
||||
|
||||
/* filter out a possible password from def_text */
|
||||
def_text_secure = strip_password (g_strdup (def_text), 1);
|
||||
if (source_easy_patterns)
|
||||
def_text_secure2 = strutils_glob_escape (def_text_secure);
|
||||
else
|
||||
def_text_secure2 = strutils_regex_escape (def_text_secure);
|
||||
|
||||
/* Create the dialog */
|
||||
|
||||
@ -895,7 +899,7 @@ file_mask_dialog (FileOpContext *ctx, FileOperation operation, const char *text,
|
||||
Quick_input.i18n = 1;
|
||||
Quick_input.widgets = fmd_widgets;
|
||||
fmd_widgets[FMDI0].text = text;
|
||||
fmd_widgets[FMDI2].text = def_text_secure;
|
||||
fmd_widgets[FMDI2].text = def_text_secure2;
|
||||
fmd_widgets[FMDI2].str_result = &dest_dir;
|
||||
fmd_widgets[FMDI1].str_result = &source_mask;
|
||||
|
||||
@ -927,6 +931,7 @@ file_mask_dialog (FileOpContext *ctx, FileOperation operation, const char *text,
|
||||
|
||||
if (!dest_dir || !*dest_dir) {
|
||||
g_free (source_mask);
|
||||
g_free(def_text_secure2);
|
||||
return dest_dir;
|
||||
}
|
||||
|
||||
@ -975,5 +980,7 @@ file_mask_dialog (FileOpContext *ctx, FileOperation operation, const char *text,
|
||||
}
|
||||
if (val == B_USER)
|
||||
*do_background = 1;
|
||||
|
||||
g_free(def_text_secure2);
|
||||
return dest_dir;
|
||||
}
|
||||
|
@ -374,8 +374,10 @@ mc_search_regex__process_replace_str (const GString * replace_str, const gsize c
|
||||
*skip_len = 0;
|
||||
|
||||
if (*curr_str == '$' && *(curr_str + 1) == '{' && (*(curr_str + 2) & (char) 0xf0) == 0x30) {
|
||||
if (strutils_is_char_escaped (replace_str->str, curr_str))
|
||||
if (strutils_is_char_escaped (replace_str->str, curr_str)){
|
||||
*skip_len = 1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (*skip_len = 0;
|
||||
current_pos + *skip_len + 2 < replace_str->len
|
||||
@ -396,8 +398,10 @@ mc_search_regex__process_replace_str (const GString * replace_str, const gsize c
|
||||
}
|
||||
|
||||
if (*curr_str == '\\') {
|
||||
if (strutils_is_char_escaped (replace_str->str, curr_str))
|
||||
if (strutils_is_char_escaped (replace_str->str, curr_str)){
|
||||
*skip_len = 1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((*(curr_str + 1) & (char) 0xf0) == 0x30) {
|
||||
ret = *(curr_str + 1) - '0';
|
||||
@ -653,8 +657,17 @@ mc_search_regex_prepare_replace_str (mc_search_t * mc_search, GString * replace_
|
||||
for (loop = 0; loop < replace_str->len - 1; loop++) {
|
||||
index = mc_search_regex__process_replace_str (replace_str, loop, &len, &replace_flags);
|
||||
|
||||
if (index == -1)
|
||||
if (index == -1) {
|
||||
if (len != 0){
|
||||
mc_search_regex__process_append_str (ret, prev_str, replace_str->str - prev_str + loop,
|
||||
&replace_flags);
|
||||
mc_search_regex__process_append_str (ret, replace_str->str + loop + 1, len-1,
|
||||
&replace_flags);
|
||||
prev_str = replace_str->str + loop + len;
|
||||
loop += len - 1;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (index == -2) {
|
||||
if (loop)
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user