diff --git a/gio/gfile.c b/gio/gfile.c index d7feca6b9..17aee12a7 100644 --- a/gio/gfile.c +++ b/gio/gfile.c @@ -1025,7 +1025,9 @@ g_file_resolve_relative_path (GFile *file, * "standard::*" means all attributes in the standard namespace. * An example attribute query be "standard::*,owner::user". * The standard attributes are available as defines, like - * #G_FILE_ATTRIBUTE_STANDARD_NAME. + * #G_FILE_ATTRIBUTE_STANDARD_NAME. #G_FILE_ATTRIBUTE_STANDARD_NAME should + * always be specified if you plan to call g_file_enumerator_get_child() or + * g_file_enumerator_iterate() on the returned enumerator. * * If @cancellable is not %NULL, then the operation can be cancelled * by triggering the cancellable object from another thread. If the diff --git a/gio/gfileenumerator.c b/gio/gfileenumerator.c index 6d651745c..429d972ab 100644 --- a/gio/gfileenumerator.c +++ b/gio/gfileenumerator.c @@ -721,6 +721,9 @@ g_file_enumerator_get_container (GFileEnumerator *enumerator) * directory of @enumerator. This function is primarily intended to be used * inside loops with g_file_enumerator_next_file(). * + * To use this, #G_FILE_ATTRIBUTE_STANDARD_NAME must have been listed in the + * attributes list used when creating the #GFileEnumerator. + * * This is a convenience method that's equivalent to: * |[ * gchar *name = g_file_info_get_name (info); @@ -736,11 +739,20 @@ GFile * g_file_enumerator_get_child (GFileEnumerator *enumerator, GFileInfo *info) { + const gchar *name; + g_return_val_if_fail (G_IS_FILE_ENUMERATOR (enumerator), NULL); g_return_val_if_fail (G_IS_FILE_INFO (info), NULL); - return g_file_get_child (enumerator->priv->container, - g_file_info_get_name (info)); + name = g_file_info_get_name (info); + + if (G_UNLIKELY (name == NULL)) + { + g_critical ("GFileEnumerator created without standard::name"); + g_return_val_if_reached (NULL); + } + + return g_file_get_child (enumerator->priv->container, name); } static void