diff --git a/gio/gdummyfile.c b/gio/gdummyfile.c index 58442ccbc..3bf5ba920 100644 --- a/gio/gdummyfile.c +++ b/gio/gdummyfile.c @@ -126,7 +126,7 @@ g_dummy_file_get_basename (GFile *file) if (dummy->decoded_uri) return g_path_get_basename (dummy->decoded_uri->path); - return g_strdup (dummy->text_uri); + return NULL; } static char * diff --git a/gio/glocalvfs.c b/gio/glocalvfs.c index f8d85e458..2dc0f2de7 100644 --- a/gio/glocalvfs.c +++ b/gio/glocalvfs.c @@ -80,7 +80,10 @@ static GFile * g_local_vfs_get_file_for_path (GVfs *vfs, const char *path) { - return _g_local_file_new (path); + if (*path == '\0') + return _g_dummy_file_new (path); + else + return _g_local_file_new (path); } static GFile * diff --git a/gio/tests/file.c b/gio/tests/file.c index c1a2a9360..7f5ee8e78 100644 --- a/gio/tests/file.c +++ b/gio/tests/file.c @@ -96,6 +96,26 @@ test_child (void) g_object_unref (file); } +static void +test_empty_path (void) +{ + GFile *file = NULL; + + g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/2328"); + g_test_summary ("Check that creating a file with an empty path results in errors"); + + /* Creating the file must always succeed. */ + file = g_file_new_for_path (""); + g_assert_nonnull (file); + + /* But then querying its path should indicate it’s invalid. */ + g_assert_null (g_file_get_path (file)); + g_assert_null (g_file_get_basename (file)); + g_assert_null (g_file_get_parent (file)); + + g_object_unref (file); +} + static void test_type (void) { @@ -2875,6 +2895,7 @@ main (int argc, char *argv[]) g_test_add_func ("/file/build-filename", test_build_filename); g_test_add_func ("/file/parent", test_parent); g_test_add_func ("/file/child", test_child); + g_test_add_func ("/file/empty-path", test_empty_path); g_test_add_func ("/file/type", test_type); g_test_add_func ("/file/parse-name", test_parse_name); g_test_add_data_func ("/file/async-create-delete/0", GINT_TO_POINTER (0), test_create_delete);