From 67ff274e6d13bc72708b5e215dd7695db7e54bc7 Mon Sep 17 00:00:00 2001 From: Pierre Dorbais Date: Jun 19 2010 14:41:53 +0000 Subject: Add patch to fix crash when deleting four or more files (Bug #592725) --- diff --git a/delete-n-files-array-overflow.patch b/delete-n-files-array-overflow.patch new file mode 100644 index 0000000..04ba10d --- /dev/null +++ b/delete-n-files-array-overflow.patch @@ -0,0 +1,102 @@ +diff -up vifm-0.5/src/keys.c.old vifm-0.5/src/keys.c +--- vifm-0.5/src/keys.c.old 2010-05-16 16:06:52.000000000 +0200 ++++ vifm-0.5/src/keys.c 2010-05-16 16:11:21.000000000 +0200 +@@ -330,6 +330,49 @@ restore_filename_filter(FileView *view) + moveto_list_pos(view, view->list_pos); + } + ++/** Deselects all files. ++ */ ++static void ++deselect_all_files(FileView* view) ++{ ++ int x; ++ for(x = 0; x < view->list_rows; x++) ++ view->dir_entry[x].selected = 0; ++ view->selected_files = 0; ++} ++ ++/** Selects given number of files or current file. ++ ++ If count == 0 and there is no selection, selects the current file. ++ Otherwise, if count == 1, selects number of files specified by ++ count_buf. ++ */ ++static void ++select_n_files(FileView* view, int count, char* count_buf) ++{ ++ if (count) ++ { ++ int x = 0; ++ int y = view->list_pos; ++ ++ deselect_all_files(view); ++ ++ for ( ; x < atoi(count_buf); x++) ++ { ++ view->dir_entry[y].selected = 1; ++ y++; ++ if (y >= view->list_rows) ++ break; ++ } ++ view->selected_files = y - view->list_pos; ++ } ++ else if (!view->selected_files) ++ { ++ view->dir_entry[view->list_pos].selected = 1; ++ view->selected_files = 1; ++ } ++} ++ + static void + yank_files(FileView *view, int count, char *count_buf) + { +@@ -376,6 +419,25 @@ yank_files(FileView *view, int count, ch + } + + static void ++delete_files(FileView *view, int count, char *count_buf) ++{ ++ char buf[32]; ++ ++ select_n_files(view, count, count_buf); ++ get_all_selected_files(view); ++ delete_file(view); ++ free_selected_file_array(view); ++ count = view->selected_files; ++ deselect_all_files(view); ++ ++ draw_dir_list(view, view->top_line, view->list_pos); ++ moveto_list_pos(view, view->list_pos); ++ snprintf(buf, sizeof(buf), " %d %s deleted.", count, ++ count == 1 ? "file" : "files"); ++ status_bar_message(buf); ++} ++ ++static void + tag_file(FileView *view) + { + if(view->dir_entry[view->list_pos].selected == 0) +@@ -1077,21 +1139,7 @@ main_key_press_cb(FileView *view) + if(curr_stats.last_char == 'd') + { + clear_num_window(); +- if(view->selected_files) +- delete_file(view); +- else if(count) +- { +- int x; +- int y = view->list_pos; +- for(x = 0; x < atoi(count_buf); x++) +- { +- view->dir_entry[y].selected = 1; +- y++; +- } +- delete_file(view); +- } +- else +- delete_file(view); ++ delete_files(view, count, count_buf); + reset_last_char = 1; + } + } diff --git a/import.log b/import.log index f50f81a..8c07581 100644 --- a/import.log +++ b/import.log @@ -1 +1,2 @@ vifm-0_5-3_fc12:F-11:vifm-0.5-3.fc12.src.rpm:1271361283 +vifm-0_5-4_fc12:F-11:vifm-0.5-4.fc12.src.rpm:1276958467 diff --git a/vifm.spec b/vifm.spec index 5d4591b..98c69a1 100644 --- a/vifm.spec +++ b/vifm.spec @@ -1,6 +1,6 @@ Name: vifm Version: 0.5 -Release: 3%{?dist} +Release: 4%{?dist} Summary: Lightweight file manager with vi like key-bindings Group: Applications/File @@ -8,6 +8,7 @@ License: GPLv2+ URL: http://%{name}.sourceforge.net/ Source0: http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.bz2 Patch0: vifm-chdorb.patch +Patch1: delete-n-files-array-overflow.patch BuildRequires: ncurses-devel @@ -17,6 +18,7 @@ A ncurses based CLI file manager with vi like key-bindings %prep %setup -q %patch0 -p1 -b .chdorb +%patch1 -p1 -b .old %build @@ -45,6 +47,9 @@ rm -rf $RPM_BUILD_ROOT %changelog +* Sat Jun 19 2010 Pierre Dorbais 0.5-4 +- Add patch to fix crash when deleting four or more files (Bug #592725) + * Tue Apr 13 2010 Pierre Dorbais 0.5-3 - Add dir macro to fix files listed twice - Add blank lines between changelog entries