summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan-Michael Brummer <jan.brummer@tabos.org>2023-01-30 16:23:30 +0100
committerJan-Michael Brummer <jan.brummer@tabos.org>2023-03-27 16:31:58 +0200
commit6b7ead10ee19141ba0a5f7efb403ea74bb69878d (patch)
tree6055d213ff2a27a4a602134a2880e5e2e429dd6e
parent81a64821f43dcd7051579ebbe67792b2bb41eae6 (diff)
downloadlibproxy-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.c12
-rw-r--r--src/backend/plugins/pacrunner-duktape/pacrunner-duktape.c12
-rw-r--r--src/backend/px-manager.c5
-rw-r--r--src/backend/px-plugin-pacrunner.h2
-rw-r--r--src/tests/data/px-manager-sample.pac2
-rw-r--r--src/tests/px-manager-test.c3
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);