diff options
author | Jan-Michael Brummer <jan.brummer@tabos.org> | 2023-01-30 16:23:30 +0100 |
---|---|---|
committer | Jan-Michael Brummer <jan.brummer@tabos.org> | 2023-03-27 16:31:58 +0200 |
commit | 6b7ead10ee19141ba0a5f7efb403ea74bb69878d (patch) | |
tree | 6055d213ff2a27a4a602134a2880e5e2e429dd6e | |
parent | 81a64821f43dcd7051579ebbe67792b2bb41eae6 (diff) | |
download | libproxy-git-6b7ead10ee19141ba0a5f7efb403ea74bb69878d.tar.gz |
Make pac parsing more robust (#27)
Ensure that the pac data is NULL-terminated and handle pac parser error.
-rw-r--r-- | src/backend/plugins/download-curl/download-curl.c | 12 | ||||
-rw-r--r-- | src/backend/plugins/pacrunner-duktape/pacrunner-duktape.c | 12 | ||||
-rw-r--r-- | src/backend/px-manager.c | 5 | ||||
-rw-r--r-- | src/backend/px-plugin-pacrunner.h | 2 | ||||
-rw-r--r-- | src/tests/data/px-manager-sample.pac | 2 | ||||
-rw-r--r-- | src/tests/px-manager-test.c | 3 |
6 files changed, 22 insertions, 14 deletions
diff --git a/src/backend/plugins/download-curl/download-curl.c b/src/backend/plugins/download-curl/download-curl.c index 06a91b8..25228bf 100644 --- a/src/backend/plugins/download-curl/download-curl.c +++ b/src/backend/plugins/download-curl/download-curl.c @@ -52,10 +52,11 @@ store_data (void *contents, size_t nmemb, void *user_pointer) { - GString *string = user_pointer; + GByteArray *byte_array = user_pointer; size_t real_size = size * nmemb; - g_string_append_len (string, contents, real_size); + g_byte_array_append (byte_array, contents, real_size); + return real_size; } @@ -64,9 +65,8 @@ px_download_curl_download (PxDownload *download, const char *uri) { PxDownloadCurl *self = PX_DOWNLOAD_CURL (download); - g_autoptr (GBytes) bytes = NULL; + GByteArray *byte_array = g_byte_array_new (); CURLcode res; - g_autoptr (GString) data = g_string_new (""); const char *url = uri; if (g_str_has_prefix (url, "pac+")) @@ -74,7 +74,7 @@ px_download_curl_download (PxDownload *download, curl_easy_setopt (self->curl, CURLOPT_URL, url); curl_easy_setopt (self->curl, CURLOPT_WRITEFUNCTION, store_data); - curl_easy_setopt (self->curl, CURLOPT_WRITEDATA, data); + curl_easy_setopt (self->curl, CURLOPT_WRITEDATA, byte_array); res = curl_easy_perform (self->curl); if (res != CURLE_OK) { @@ -82,7 +82,7 @@ px_download_curl_download (PxDownload *download, return NULL; } - return g_steal_pointer (&bytes); + return g_byte_array_free_to_bytes (byte_array); } static void diff --git a/src/backend/plugins/pacrunner-duktape/pacrunner-duktape.c b/src/backend/plugins/pacrunner-duktape/pacrunner-duktape.c index 86221f3..72f4b2b 100644 --- a/src/backend/plugins/pacrunner-duktape/pacrunner-duktape.c +++ b/src/backend/plugins/pacrunner-duktape/pacrunner-duktape.c @@ -147,18 +147,22 @@ px_pacrunner_duktape_class_init (PxPacRunnerDuktapeClass *klass) object_class->dispose = px_pacrunner_duktape_dispose; } -static void +static gboolean px_pacrunner_duktape_set_pac (PxPacRunner *pacrunner, GBytes *pac_data) { PxPacRunnerDuktape *self = PX_PACRUNNER_DUKTAPE (pacrunner); + gsize len; + gconstpointer content = g_bytes_get_data (pac_data, &len); + g_autoptr (GString) pac = g_string_new_len (content, len); - - duk_push_string (self->ctx, g_bytes_get_data (pac_data, NULL)); + duk_push_string (self->ctx, pac->str); if (duk_peval_noresult (self->ctx)) { - return; + return FALSE; } + + return TRUE; } static char * diff --git a/src/backend/px-manager.c b/src/backend/px-manager.c index be86830..ea4411e 100644 --- a/src/backend/px-manager.c +++ b/src/backend/px-manager.c @@ -339,7 +339,10 @@ px_manager_run_pac (PeasExtensionSet *set, struct PacData *pac_data = data; char *ret; - ifc->set_pac (PX_PAC_RUNNER (extension), pac_data->pac); + if (!ifc->set_pac (PX_PAC_RUNNER (extension), pac_data->pac)) { + return; + } + ret = ifc->run (PX_PAC_RUNNER (extension), pac_data->uri); if (ret) g_strv_builder_add (pac_data->builder, ret); diff --git a/src/backend/px-plugin-pacrunner.h b/src/backend/px-plugin-pacrunner.h index 2b38c40..0226dc0 100644 --- a/src/backend/px-plugin-pacrunner.h +++ b/src/backend/px-plugin-pacrunner.h @@ -34,7 +34,7 @@ struct _PxPacRunnerInterface { GTypeInterface parent_iface; - void (*set_pac) (PxPacRunner *pacrunner, GBytes *pac_data); + gboolean (*set_pac) (PxPacRunner *pacrunner, GBytes *pac_data); char *(*run) (PxPacRunner *self, GUri *uri); }; diff --git a/src/tests/data/px-manager-sample.pac b/src/tests/data/px-manager-sample.pac index 48d01f0..b86c555 100644 --- a/src/tests/data/px-manager-sample.pac +++ b/src/tests/data/px-manager-sample.pac @@ -3,4 +3,4 @@ function FindProxyForURL(url, host) var myIP = myIpAddress(); return "PROXY 127.0.0.1:1983" -}
\ No newline at end of file +} diff --git a/src/tests/px-manager-test.c b/src/tests/px-manager-test.c index 428f5d2..afab118 100644 --- a/src/tests/px-manager-test.c +++ b/src/tests/px-manager-test.c @@ -38,6 +38,7 @@ server_callback (SoupServer *server, GHashTable *query, gpointer data) { + g_print ("%s: path %s\n", __FUNCTION__, path); soup_server_message_set_status (SOUP_SERVER_MESSAGE (msg), SOUP_STATUS_OK, NULL); if (g_strcmp0 (path, "/test.pac") == 0) { @@ -85,7 +86,7 @@ download_pac (gpointer data) Fixture *self = data; GBytes *pac; - pac = px_manager_pac_download (self->manager, "http://127.0.0.1:1983"); + pac = px_manager_pac_download (self->manager, "http://127.0.0.1:1983/test.pac"); g_assert_nonnull (pac); g_main_loop_quit (self->loop); |