From 3902006a5b043ad418ff5ee1542d54c678280db8 Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Tue, 12 Mar 2013 12:53:42 -0400 Subject: [PATCH] glocalfileinfo: Stop using PATH_MAX for .hidden We were using PATH_MAX to size a static array for reading lines from the .hidden file. Some platforms (Hurd) don't declare a PATH_MAX. Switch to using g_file_get_contents() and g_str_split('\n') instead. Also take the time to clean up a bit with a switch to using a 'set mode' GHashTable (since this code was originally written before we had those). This patch is largely based on a patch from Emilio Pozuelo Monfort (who also reported the bug). https://bugzilla.gnome.org/show_bug.cgi?id=695147 --- gio/glocalfileinfo.c | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/gio/glocalfileinfo.c b/gio/glocalfileinfo.c index 90a074b..92bd35f 100644 --- a/gio/glocalfileinfo.c +++ b/gio/glocalfileinfo.c @@ -1437,35 +1437,30 @@ remove_from_hidden_cache (gpointer user_data) static GHashTable * read_hidden_file (const gchar *dirname) { + gchar *contents = NULL; gchar *filename; - FILE *hidden; filename = g_build_path ("/", dirname, ".hidden", NULL); - hidden = fopen (filename, "r"); + g_file_get_contents (filename, &contents, NULL, NULL); g_free (filename); - if (hidden != NULL) + if (contents != NULL) { - gchar buffer[PATH_MAX + 2]; /* \n\0 */ GHashTable *table; + gchar **lines; + gint i; table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); - while (fgets (buffer, sizeof buffer, hidden)) - { - gchar *newline; - - if ((newline = strchr (buffer, '\n')) != NULL) - { - *newline++ = '\0'; + lines = g_strsplit (contents, "\n", 0); + g_free (contents); - g_hash_table_insert (table, - g_memdup (buffer, newline - buffer), - GINT_TO_POINTER (TRUE)); - } - } + for (i = 0; lines[i]; i++) + /* hash table takes the individual strings... */ + g_hash_table_add (table, lines[i]); - fclose (hidden); + /* ... so we only free the container. */ + g_free (lines); return table; } @@ -1517,8 +1512,7 @@ file_is_hidden (const gchar *path, g_source_unref (remove_from_cache_source); } - result = table != NULL && - GPOINTER_TO_INT (g_hash_table_lookup (table, basename)); + result = table != NULL && g_hash_table_contains (table, basename); G_UNLOCK (hidden_cache); -- 2.7.4