From 24dee8e93577c0b538b37f5d88fd19f6b39a7961 Mon Sep 17 00:00:00 2001 From: hiro Date: Fri, 25 Jan 2013 06:57:35 +0000 Subject: limit the recursion level of tree scan to 64. git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@3197 ee746299-78ed-0310-b773-934348b2243d --- ChangeLog | 5 +++++ libsylph/mh.c | 50 ++++++++++++++++++++++++++++---------------------- 2 files changed, 33 insertions(+), 22 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3aa354e0..0c8a44c4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2013-01-25 + + * libsylph/mh.c: mh_scan_tree_recursive(): limit the recursion level + to 64. + 2013-01-25 * src/prefs_filter_edit.c: prefs_filter_edit_action_hbox_to_action(): diff --git a/libsylph/mh.c b/libsylph/mh.c index 89ba6baa..e8afa6b9 100644 --- a/libsylph/mh.c +++ b/libsylph/mh.c @@ -1665,6 +1665,8 @@ static void mh_remove_missing_folder_items(Folder *folder) mh_remove_missing_folder_items_func, folder); } +#define MAX_RECURSION_LEVEL 64 + static void mh_scan_tree_recursive(FolderItem *item) { Folder *folder; @@ -1691,6 +1693,32 @@ static void mh_scan_tree_recursive(FolderItem *item) folder = item->folder; + debug_print("scanning %s ...\n", + item->path ? item->path : LOCAL_FOLDER(folder)->rootpath); + if (folder->ui_func) + folder->ui_func(folder, item, folder->ui_func_data); + + if (item->path) { + gint new, unread, total, min, max; + + procmsg_get_mark_sum + (item, &new, &unread, &total, &min, &max, 0); + if (n_msg > total) { + new += n_msg - total; + unread += n_msg - total; + } + item->new = new; + item->unread = unread; + item->total = n_msg; + item->updated = TRUE; + item->mtime = 0; + } + + if (g_node_depth(item->node) >= MAX_RECURSION_LEVEL) { + g_warning("mh_scan_tree_recursive(): max recursion level (%u) reached.", MAX_RECURSION_LEVEL); + return; + } + fs_path = item->path ? g_filename_from_utf8(item->path, -1, NULL, NULL, NULL) : g_strdup("."); @@ -1713,12 +1741,6 @@ static void mh_scan_tree_recursive(FolderItem *item) #endif g_free(fs_path); - debug_print("scanning %s ...\n", - item->path ? item->path - : LOCAL_FOLDER(item->folder)->rootpath); - if (folder->ui_func) - folder->ui_func(folder, item, folder->ui_func_data); - #ifdef G_OS_WIN32 do { if (!wfd.file_name) continue; @@ -1845,22 +1867,6 @@ static void mh_scan_tree_recursive(FolderItem *item) #else closedir(dp); #endif - - if (item->path) { - gint new, unread, total, min, max; - - procmsg_get_mark_sum - (item, &new, &unread, &total, &min, &max, 0); - if (n_msg > total) { - new += n_msg - total; - unread += n_msg - total; - } - item->new = new; - item->unread = unread; - item->total = n_msg; - item->updated = TRUE; - item->mtime = 0; - } } static gboolean mh_rename_folder_func(GNode *node, gpointer data) -- cgit v1.2.3