From: Matthias Clasen Date: Wed, 16 Apr 2008 21:55:32 +0000 (+0000) Subject: Rework the timestamp checking code to protect against duplicate X-Git-Tag: GLIB_2_17_0~77 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9fd295d28545f096ad1e453d7ad121013d018613;p=platform%2Fupstream%2Fglib.git Rework the timestamp checking code to protect against duplicate 2008-04-16 Matthias Clasen * xdgmime/xdgmime.c: Rework the timestamp checking code to protect against duplicate directories in XDG_DATA_DIRS. Fixes fd.o bug 12513, reported by Joe Shaw. svn path=/trunk/; revision=6859 --- diff --git a/gio/ChangeLog b/gio/ChangeLog index b87b42c..3e9a92c 100644 --- a/gio/ChangeLog +++ b/gio/ChangeLog @@ -1,5 +1,11 @@ 2008-04-16 Matthias Clasen + * xdgmime/xdgmime.c: Rework the timestamp checking code + to protect against duplicate directories in XDG_DATA_DIRS. + Fixes fd.o bug 12513, reported by Joe Shaw. + +2008-04-16 Matthias Clasen + Partically revert the last commit after realizing that xdg_mime_media_type_equal doesn't have to init at all. diff --git a/gio/xdgmime/xdgmime.c b/gio/xdgmime/xdgmime.c index 4552fd7..332c165 100644 --- a/gio/xdgmime/xdgmime.c +++ b/gio/xdgmime/xdgmime.c @@ -93,17 +93,26 @@ struct XdgCallbackList typedef int (*XdgDirectoryFunc) (const char *directory, void *user_data); -static XdgDirTimeList * -xdg_dir_time_list_new (void) +static void +xdg_dir_time_list_add (char *file_name, + time_t mtime) { - XdgDirTimeList *retval; - - retval = calloc (1, sizeof (XdgDirTimeList)); - retval->checked = XDG_CHECKED_UNCHECKED; + XdgDirTimeList *list; - return retval; + for (list = dir_time_list; list; list = list->next) + { + if (strcmp (list->directory_name, file_name) == 0) + return; + } + + list = calloc (1, sizeof (XdgDirTimeList)); + list->checked = XDG_CHECKED_UNCHECKED; + list->directory_name = file_name; + list->mtime = mtime; + list->next = dir_time_list; + dir_time_list = list; } - + static void xdg_dir_time_list_free (XdgDirTimeList *list) { @@ -123,7 +132,6 @@ xdg_mime_init_from_directory (const char *directory) { char *file_name; struct stat st; - XdgDirTimeList *list; assert (directory != NULL); @@ -135,11 +143,7 @@ xdg_mime_init_from_directory (const char *directory) if (cache != NULL) { - list = xdg_dir_time_list_new (); - list->directory_name = file_name; - list->mtime = st.st_mtime; - list->next = dir_time_list; - dir_time_list = list; + xdg_dir_time_list_add (file_name, st.st_mtime); _caches = realloc (_caches, sizeof (XdgMimeCache *) * (n_caches + 2)); _caches[n_caches] = cache; @@ -156,12 +160,7 @@ xdg_mime_init_from_directory (const char *directory) if (stat (file_name, &st) == 0) { _xdg_mime_glob_read_from_file (global_hash, file_name); - - list = xdg_dir_time_list_new (); - list->directory_name = file_name; - list->mtime = st.st_mtime; - list->next = dir_time_list; - dir_time_list = list; + xdg_dir_time_list_add (file_name, st.st_mtime); } else { @@ -173,12 +172,7 @@ xdg_mime_init_from_directory (const char *directory) if (stat (file_name, &st) == 0) { _xdg_mime_magic_read_from_file (global_magic, file_name); - - list = xdg_dir_time_list_new (); - list->directory_name = file_name; - list->mtime = st.st_mtime; - list->next = dir_time_list; - dir_time_list = list; + xdg_dir_time_list_add (file_name, st.st_mtime); } else { @@ -296,12 +290,11 @@ xdg_check_file (const char *file_path, for (list = dir_time_list; list; list = list->next) { - if (! strcmp (list->directory_name, file_path) && - st.st_mtime == list->mtime) + if (! strcmp (list->directory_name, file_path)) { - if (list->checked == XDG_CHECKED_UNCHECKED) + if (st.st_mtime == list->mtime) list->checked = XDG_CHECKED_VALID; - else if (list->checked == XDG_CHECKED_VALID) + else list->checked = XDG_CHECKED_INVALID; return (list->checked != XDG_CHECKED_VALID);