[geocode-glib/wip/wjt/30-nominatim-soup3] nominatim: Correctly read response data from soup3




commit 72285d203963c118a05f810016b584210663ae80
Author: Will Thompson <wjt endlessos org>
Date:   Sat Aug 6 13:50:20 2022 +0100

    nominatim: Correctly read response data from soup3
    
    Previously, the soup3 branch would call g_bytes_unref_to_data() on the
    response data, with a NULL out parameter for the size, and then proceed
    to use the data pointer as a NULL-terminated string. This is wrong for
    two reasons:
    
    - g_bytes_unref_to_data()'s size parameter may not be NULL
    - The response data is not NULL-terminated
    
    Instead, do what the soup2 branch does: use g_strndup() to get a
    NULL-terminated string.
    
    No automatic test, but the async branch at least can be tested by
    running the test binary with an argument:
    
        _build/geocode-glib/tests/geocode-glib aoeuaoeuaoeu
    
    Note that you must change the search term each time, since the result is
    cached.
    
    Fixes: https://gitlab.gnome.org/GNOME/geocode-glib/-/issues/30

 geocode-glib/geocode-nominatim.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)
---
diff --git a/geocode-glib/geocode-nominatim.c b/geocode-glib/geocode-nominatim.c
index 2a458da..d18e71f 100644
--- a/geocode-glib/geocode-nominatim.c
+++ b/geocode-glib/geocode-nominatim.c
@@ -890,9 +890,8 @@ on_query_data_loaded (GObject      *object,
        SoupSession *session = SOUP_SESSION (object);
        SoupMessage *query = soup_session_get_async_result_message (session, result);
        GError *error = NULL;
-       GBytes *body = soup_session_send_and_read_finish (session, result, &error);
+       g_autoptr(GBytes) body = soup_session_send_and_read_finish (session, result, &error);
        GTask *task = user_data;
-       char *contents;
 
        if (!body) {
                g_task_return_new_error (task,
@@ -903,14 +902,16 @@ on_query_data_loaded (GObject      *object,
                g_clear_error (&error);
        } else if (soup_message_get_status (query) != SOUP_STATUS_OK) {
                const char *reason_phrase = soup_message_get_reason_phrase (query);
-               g_bytes_unref (body);
                g_task_return_new_error (task,
                                         G_IO_ERROR,
                                         G_IO_ERROR_FAILED,
                                         "%s",
                                         reason_phrase ? reason_phrase : "Query failed");
        } else {
-               contents = g_bytes_unref_to_data (body, NULL);
+               gsize size = 0;
+               gconstpointer data = g_bytes_get_data (body, &size);
+               gchar *contents = g_strndup (data, size);
+
                _geocode_glib_cache_save (query, contents);
                g_task_return_pointer (task, contents, g_free);
        }
@@ -1059,7 +1060,7 @@ geocode_nominatim_query (GeocodeNominatim  *self,
        if (_geocode_glib_cache_load (soup_query, &contents) == FALSE) {
 #if SOUP_CHECK_VERSION (2, 99, 2)
                GError *serror = NULL;
-               GBytes *body = soup_session_send_and_read (soup_session, soup_query, NULL, &serror);
+               g_autoptr(GBytes) body = soup_session_send_and_read (soup_session, soup_query, NULL, &serror);
                if (!body) {
                        g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
                                             serror->message);
@@ -1067,12 +1068,14 @@ geocode_nominatim_query (GeocodeNominatim  *self,
                        contents = NULL;
                } else if (soup_message_get_status (soup_query) != SOUP_STATUS_OK) {
                        const char *reason_phrase = soup_message_get_reason_phrase (soup_query);
-                       g_bytes_unref (body);
                        g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
                                             reason_phrase ? reason_phrase : "Query failed");
                        contents = NULL;
                } else {
-                       contents = g_bytes_unref_to_data (body, NULL);
+                       gsize size = 0;
+                       gconstpointer data = g_bytes_get_data (body, &size);
+                       contents = g_strndup (data, size);
+
                        _geocode_glib_cache_save (soup_query, contents);
                }
 #else


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]