gresolver: Ensure GThreadedResolver always sets an error if resolution fails
authorPhilip Withnall <philip.withnall@collabora.co.uk>
Thu, 24 Apr 2014 08:26:12 +0000 (09:26 +0100)
committerPhilip Withnall <philip.withnall@collabora.co.uk>
Fri, 25 Apr 2014 08:52:01 +0000 (09:52 +0100)
It was previously possible for GThreadedResolver to return an empty list
and no error in response to a g_resolver_lookup_by_name() call, if it
happened that all the addresses returned by getaddrinfo() could not be
converted from native addresses to GSocketAddresses.

Fix that by setting a G_RESOLVER_ERROR_NOT_FOUND if the returned list is
empty.

https://bugzilla.gnome.org/show_bug.cgi?id=728776

gio/gthreadedresolver.c

index 8e8d07e..9bb864c 100644 (file)
@@ -96,9 +96,22 @@ do_lookup_by_name (GTask         *task,
           g_object_unref (sockaddr);
         }
 
-      addresses = g_list_reverse (addresses);
-      g_task_return_pointer (task, addresses,
-                             (GDestroyNotify)g_resolver_free_addresses);
+      if (addresses != NULL)
+        {
+          addresses = g_list_reverse (addresses);
+          g_task_return_pointer (task, addresses,
+                                 (GDestroyNotify)g_resolver_free_addresses);
+        }
+      else
+        {
+          /* All addresses failed to be converted to GSocketAddresses. */
+          g_task_return_new_error (task,
+                                   G_RESOLVER_ERROR,
+                                   G_RESOLVER_ERROR_NOT_FOUND,
+                                   _("Error resolving '%s': %s"),
+                                   hostname,
+                                   _("No valid addresses were found"));
+        }
     }
   else
     {