You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
578 lines
22 KiB
578 lines
22 KiB
commit 983e8ec37b0ec1cc5114cb9ca49cf558dedfb31e |
|
Author: Miloslav Trmač <mitr@redhat.com> |
|
Date: Tue Jul 1 20:00:48 2014 +0200 |
|
|
|
Don't pass an uninitialized JS parameter |
|
|
|
Don't pass argc==3 when using a 2-member array in |
|
polkit_backend_js_authority_check_authorization_sync . To avoid such |
|
problems in the future, use G_N_ELEMENTS in both similar callers. |
|
|
|
https://bugs.freedesktop.org/show_bug.cgi?id=69501 |
|
|
|
diff --git a/src/polkitbackend/polkitbackendjsauthority.c b/src/polkitbackend/polkitbackendjsauthority.c |
|
index c232573..c7a29e0 100644 |
|
--- a/src/polkitbackend/polkitbackendjsauthority.c |
|
+++ b/src/polkitbackend/polkitbackendjsauthority.c |
|
@@ -1074,7 +1074,7 @@ polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveA |
|
|
|
if (!call_js_function_with_runaway_killer (authority, |
|
"_runAdminRules", |
|
- 2, |
|
+ G_N_ELEMENTS (argv), |
|
argv, |
|
&rval)) |
|
{ |
|
@@ -1179,7 +1179,7 @@ polkit_backend_js_authority_check_authorization_sync (PolkitBackendInteractiveAu |
|
|
|
if (!call_js_function_with_runaway_killer (authority, |
|
"_runRules", |
|
- 3, |
|
+ G_N_ELEMENTS (argv), |
|
argv, |
|
&rval)) |
|
{ |
|
|
|
commit a97672540c66c03ed392fc072f0c682281f08989 |
|
Author: Miloslav Trmač <mitr@redhat.com> |
|
Date: Tue Jul 1 20:00:48 2014 +0200 |
|
|
|
Don't add extra NULL group to subject.groups |
|
|
|
The NULL “terminator” of ‘groups’ was being passed to JavaScript. Drop |
|
it, and simplify by leting set_property_strv use the GPtrArray directly |
|
instead of the extra conversions “into” a strv and a completely dead |
|
g_strv_length(). |
|
|
|
https://bugs.freedesktop.org/show_bug.cgi?id=69501 |
|
|
|
diff --git a/src/polkitbackend/polkitbackendjsauthority.c b/src/polkitbackend/polkitbackendjsauthority.c |
|
index c7a29e0..efb07a9 100644 |
|
--- a/src/polkitbackend/polkitbackendjsauthority.c |
|
+++ b/src/polkitbackend/polkitbackendjsauthority.c |
|
@@ -659,26 +659,22 @@ static void |
|
set_property_strv (PolkitBackendJsAuthority *authority, |
|
JSObject *obj, |
|
const gchar *name, |
|
- const gchar *const *value, |
|
- gssize len) |
|
+ GPtrArray *value) |
|
{ |
|
jsval value_jsval; |
|
JSObject *array_object; |
|
jsval *jsvals; |
|
guint n; |
|
|
|
- if (len < 0) |
|
- len = g_strv_length ((gchar **) value); |
|
- |
|
- jsvals = g_new0 (jsval, len); |
|
- for (n = 0; n < len; n++) |
|
+ jsvals = g_new0 (jsval, value->len); |
|
+ for (n = 0; n < value->len; n++) |
|
{ |
|
JSString *jsstr; |
|
- jsstr = JS_NewStringCopyZ (authority->priv->cx, value[n]); |
|
+ jsstr = JS_NewStringCopyZ (authority->priv->cx, g_ptr_array_index(value, n)); |
|
jsvals[n] = STRING_TO_JSVAL (jsstr); |
|
} |
|
|
|
- array_object = JS_NewArrayObject (authority->priv->cx, (gint32) len, jsvals); |
|
+ array_object = JS_NewArrayObject (authority->priv->cx, value->len, jsvals); |
|
|
|
value_jsval = OBJECT_TO_JSVAL (array_object); |
|
JS_SetProperty (authority->priv->cx, obj, name, &value_jsval); |
|
@@ -818,11 +814,9 @@ subject_to_jsval (PolkitBackendJsAuthority *authority, |
|
} |
|
} |
|
|
|
- g_ptr_array_add (groups, NULL); |
|
- |
|
set_property_int32 (authority, obj, "pid", pid); |
|
set_property_str (authority, obj, "user", user_name); |
|
- set_property_strv (authority, obj, "groups", (const gchar* const *) groups->pdata, groups->len); |
|
+ set_property_strv (authority, obj, "groups", groups); |
|
set_property_str (authority, obj, "seat", seat_str); |
|
set_property_str (authority, obj, "session", session_str); |
|
set_property_bool (authority, obj, "local", subject_is_local); |
|
|
|
commit cbad0d5721804a4b7c2d998b00da9e70dc623820 |
|
Author: Miloslav Trmač <mitr@redhat.com> |
|
Date: Tue Jul 1 20:00:48 2014 +0200 |
|
|
|
Don't store unrooted jsvals on heap |
|
|
|
Don't create a temporary array of jsvals on heap; the GC is not looking |
|
for GC roots there. |
|
|
|
Compare |
|
https://developer.mozilla.org/en-US/docs/SpiderMonkey/GC_Rooting_Guide |
|
and |
|
https://web.archive.org/web/20140305233124/https://developer.mozilla.org/en-US/docs/SpiderMonkey_Garbage_Collection_Tips |
|
. |
|
|
|
https://bugs.freedesktop.org/show_bug.cgi?id=69501 |
|
|
|
diff --git a/src/polkitbackend/polkitbackendjsauthority.c b/src/polkitbackend/polkitbackendjsauthority.c |
|
index efb07a9..d02e5e3 100644 |
|
--- a/src/polkitbackend/polkitbackendjsauthority.c |
|
+++ b/src/polkitbackend/polkitbackendjsauthority.c |
|
@@ -663,23 +663,22 @@ set_property_strv (PolkitBackendJsAuthority *authority, |
|
{ |
|
jsval value_jsval; |
|
JSObject *array_object; |
|
- jsval *jsvals; |
|
guint n; |
|
|
|
- jsvals = g_new0 (jsval, value->len); |
|
+ array_object = JS_NewArrayObject (authority->priv->cx, 0, NULL); |
|
+ |
|
for (n = 0; n < value->len; n++) |
|
{ |
|
JSString *jsstr; |
|
+ jsval val; |
|
+ |
|
jsstr = JS_NewStringCopyZ (authority->priv->cx, g_ptr_array_index(value, n)); |
|
- jsvals[n] = STRING_TO_JSVAL (jsstr); |
|
+ val = STRING_TO_JSVAL (jsstr); |
|
+ JS_SetElement (authority->priv->cx, array_object, n, &val); |
|
} |
|
|
|
- array_object = JS_NewArrayObject (authority->priv->cx, value->len, jsvals); |
|
- |
|
value_jsval = OBJECT_TO_JSVAL (array_object); |
|
JS_SetProperty (authority->priv->cx, obj, name, &value_jsval); |
|
- |
|
- g_free (jsvals); |
|
} |
|
|
|
|
|
|
|
commit 0f5852a4bdabe377ddcdbed09a0c1f95710e17fe |
|
Author: Miloslav Trmač <mitr@redhat.com> |
|
Date: Tue Jul 1 20:00:48 2014 +0200 |
|
|
|
Fix a per-authorization memory leak |
|
|
|
We were leaking PolkitAuthorizationResult on every request, primarily on |
|
the success path, but also on various error paths as well. |
|
|
|
https://bugs.freedesktop.org/show_bug.cgi?id=69501 |
|
|
|
diff --git a/src/polkitbackend/polkitbackendauthority.c b/src/polkitbackend/polkitbackendauthority.c |
|
index a09d667..14eea99 100644 |
|
--- a/src/polkitbackend/polkitbackendauthority.c |
|
+++ b/src/polkitbackend/polkitbackendauthority.c |
|
@@ -714,6 +714,7 @@ check_auth_cb (GObject *source_object, |
|
g_variant_ref_sink (value); |
|
g_dbus_method_invocation_return_value (data->invocation, g_variant_new ("(@(bba{ss}))", value)); |
|
g_variant_unref (value); |
|
+ g_object_unref (result); |
|
} |
|
|
|
check_auth_data_free (data); |
|
diff --git a/src/polkitbackend/polkitbackendinteractiveauthority.c b/src/polkitbackend/polkitbackendinteractiveauthority.c |
|
index 96725f7..7019356 100644 |
|
--- a/src/polkitbackend/polkitbackendinteractiveauthority.c |
|
+++ b/src/polkitbackend/polkitbackendinteractiveauthority.c |
|
@@ -1022,7 +1022,7 @@ polkit_backend_interactive_authority_check_authorization (PolkitBackendAuthority |
|
|
|
/* Otherwise just return the result */ |
|
g_simple_async_result_set_op_res_gpointer (simple, |
|
- result, |
|
+ g_object_ref (result), |
|
g_object_unref); |
|
g_simple_async_result_complete (simple); |
|
g_object_unref (simple); |
|
@@ -1039,6 +1039,9 @@ polkit_backend_interactive_authority_check_authorization (PolkitBackendAuthority |
|
g_free (subject_str); |
|
g_free (user_of_caller_str); |
|
g_free (user_of_subject_str); |
|
+ |
|
+ if (result != NULL) |
|
+ g_object_unref (result); |
|
} |
|
|
|
/* ---------------------------------------------------------------------------------------------------- */ |
|
|
|
commit ec039f9d7ede5b839f5511e26d5cd6ae9107cb2e |
|
Author: Miloslav Trmač <mitr@redhat.com> |
|
Date: Tue Jul 1 20:00:48 2014 +0200 |
|
|
|
Fix a memory leak when registering an authentication agent |
|
|
|
https://bugs.freedesktop.org/show_bug.cgi?id=69501 |
|
|
|
diff --git a/src/polkitbackend/polkitbackendauthority.c b/src/polkitbackend/polkitbackendauthority.c |
|
index 14eea99..64560e1 100644 |
|
--- a/src/polkitbackend/polkitbackendauthority.c |
|
+++ b/src/polkitbackend/polkitbackendauthority.c |
|
@@ -900,6 +900,7 @@ server_handle_register_authentication_agent (Server *server, |
|
g_dbus_method_invocation_return_value (invocation, g_variant_new ("()")); |
|
|
|
out: |
|
+ g_variant_unref (subject_gvariant); |
|
if (subject != NULL) |
|
g_object_unref (subject); |
|
} |
|
|
|
commit 57e2d86edc2630cac1812a3285715dad795a4bd6 |
|
Author: Miloslav Trmač <mitr@redhat.com> |
|
Date: Tue Jul 1 20:00:48 2014 +0200 |
|
|
|
Wrap all JS usage within “requests” |
|
|
|
Required by |
|
https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/JSAPI_reference/JS_THREADSAFE |
|
; lack of requests causes assertion failures with a debug build of |
|
mozjs17. |
|
|
|
https://bugs.freedesktop.org/show_bug.cgi?id=69501 |
|
|
|
diff --git a/src/polkitbackend/polkitbackendjsauthority.c b/src/polkitbackend/polkitbackendjsauthority.c |
|
index d02e5e3..88f31bd 100644 |
|
--- a/src/polkitbackend/polkitbackendjsauthority.c |
|
+++ b/src/polkitbackend/polkitbackendjsauthority.c |
|
@@ -239,6 +239,7 @@ rules_file_name_cmp (const gchar *a, |
|
return ret; |
|
} |
|
|
|
+/* authority->priv->cx must be within a request */ |
|
static void |
|
load_scripts (PolkitBackendJsAuthority *authority) |
|
{ |
|
@@ -339,6 +340,8 @@ reload_scripts (PolkitBackendJsAuthority *authority) |
|
jsval argv[1] = {JSVAL_NULL}; |
|
jsval rval = JSVAL_NULL; |
|
|
|
+ JS_BeginRequest (authority->priv->cx); |
|
+ |
|
if (!JS_CallFunctionName(authority->priv->cx, |
|
authority->priv->js_polkit, |
|
"_deleteRules", |
|
@@ -364,7 +367,7 @@ reload_scripts (PolkitBackendJsAuthority *authority) |
|
/* Let applications know we have new rules... */ |
|
g_signal_emit_by_name (authority, "changed"); |
|
out: |
|
- ; |
|
+ JS_EndRequest (authority->priv->cx); |
|
} |
|
|
|
static void |
|
@@ -447,6 +450,7 @@ static void |
|
polkit_backend_js_authority_constructed (GObject *object) |
|
{ |
|
PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object); |
|
+ gboolean entered_request = FALSE; |
|
|
|
authority->priv->rt = JS_NewRuntime (8L * 1024L * 1024L); |
|
if (authority->priv->rt == NULL) |
|
@@ -466,6 +470,9 @@ polkit_backend_js_authority_constructed (GObject *object) |
|
JS_SetErrorReporter(authority->priv->cx, report_error); |
|
JS_SetContextPrivate (authority->priv->cx, authority); |
|
|
|
+ JS_BeginRequest(authority->priv->cx); |
|
+ entered_request = TRUE; |
|
+ |
|
authority->priv->js_global = |
|
#if JS_VERSION == 186 |
|
JS_NewGlobalObject (authority->priv->cx, &js_global_class, NULL); |
|
@@ -526,10 +533,15 @@ polkit_backend_js_authority_constructed (GObject *object) |
|
setup_file_monitors (authority); |
|
load_scripts (authority); |
|
|
|
+ JS_EndRequest (authority->priv->cx); |
|
+ entered_request = FALSE; |
|
+ |
|
G_OBJECT_CLASS (polkit_backend_js_authority_parent_class)->constructed (object); |
|
return; |
|
|
|
fail: |
|
+ if (entered_request) |
|
+ JS_EndRequest (authority->priv->cx); |
|
g_critical ("Error initializing JavaScript environment"); |
|
g_assert_not_reached (); |
|
} |
|
@@ -642,6 +654,7 @@ polkit_backend_js_authority_class_init (PolkitBackendJsAuthorityClass *klass) |
|
|
|
/* ---------------------------------------------------------------------------------------------------- */ |
|
|
|
+/* authority->priv->cx must be within a request */ |
|
static void |
|
set_property_str (PolkitBackendJsAuthority *authority, |
|
JSObject *obj, |
|
@@ -655,6 +668,7 @@ set_property_str (PolkitBackendJsAuthority *authority, |
|
JS_SetProperty (authority->priv->cx, obj, name, &value_jsval); |
|
} |
|
|
|
+/* authority->priv->cx must be within a request */ |
|
static void |
|
set_property_strv (PolkitBackendJsAuthority *authority, |
|
JSObject *obj, |
|
@@ -681,7 +695,7 @@ set_property_strv (PolkitBackendJsAuthority *authority, |
|
JS_SetProperty (authority->priv->cx, obj, name, &value_jsval); |
|
} |
|
|
|
- |
|
+/* authority->priv->cx must be within a request */ |
|
static void |
|
set_property_int32 (PolkitBackendJsAuthority *authority, |
|
JSObject *obj, |
|
@@ -693,6 +707,7 @@ set_property_int32 (PolkitBackendJsAuthority *authority, |
|
JS_SetProperty (authority->priv->cx, obj, name, &value_jsval); |
|
} |
|
|
|
+/* authority->priv->cx must be within a request */ |
|
static void |
|
set_property_bool (PolkitBackendJsAuthority *authority, |
|
JSObject *obj, |
|
@@ -706,6 +721,7 @@ set_property_bool (PolkitBackendJsAuthority *authority, |
|
|
|
/* ---------------------------------------------------------------------------------------------------- */ |
|
|
|
+/* authority->priv->cx must be within a request */ |
|
static gboolean |
|
subject_to_jsval (PolkitBackendJsAuthority *authority, |
|
PolkitSubject *subject, |
|
@@ -838,6 +854,7 @@ subject_to_jsval (PolkitBackendJsAuthority *authority, |
|
|
|
/* ---------------------------------------------------------------------------------------------------- */ |
|
|
|
+/* authority->priv->cx must be within a request */ |
|
static gboolean |
|
action_and_details_to_jsval (PolkitBackendJsAuthority *authority, |
|
const gchar *action_id, |
|
@@ -1041,6 +1058,8 @@ polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveA |
|
gchar *ret_str = NULL; |
|
gchar **ret_strs = NULL; |
|
|
|
+ JS_BeginRequest (authority->priv->cx); |
|
+ |
|
if (!action_and_details_to_jsval (authority, action_id, details, &argv[0], &error)) |
|
{ |
|
polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority), |
|
@@ -1120,6 +1139,8 @@ polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveA |
|
|
|
JS_MaybeGC (authority->priv->cx); |
|
|
|
+ JS_EndRequest (authority->priv->cx); |
|
+ |
|
return ret; |
|
} |
|
|
|
@@ -1146,6 +1167,8 @@ polkit_backend_js_authority_check_authorization_sync (PolkitBackendInteractiveAu |
|
gchar *ret_str = NULL; |
|
gboolean good = FALSE; |
|
|
|
+ JS_BeginRequest (authority->priv->cx); |
|
+ |
|
if (!action_and_details_to_jsval (authority, action_id, details, &argv[0], &error)) |
|
{ |
|
polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority), |
|
@@ -1222,6 +1245,8 @@ polkit_backend_js_authority_check_authorization_sync (PolkitBackendInteractiveAu |
|
|
|
JS_MaybeGC (authority->priv->cx); |
|
|
|
+ JS_EndRequest (authority->priv->cx); |
|
+ |
|
return ret; |
|
} |
|
|
|
|
|
commit 5c668722320eb363f713a0998934aa48fecd56cb |
|
Author: Miloslav Trmač <mitr@redhat.com> |
|
Date: Tue Jul 1 20:00:48 2014 +0200 |
|
|
|
Register heap-based JSObject pointers to GC |
|
|
|
This is necessary so that the GC can move the objects (though I haven't |
|
so far encountered this in testing). |
|
|
|
https://bugs.freedesktop.org/show_bug.cgi?id=69501 |
|
|
|
diff --git a/src/polkitbackend/polkitbackendjsauthority.c b/src/polkitbackend/polkitbackendjsauthority.c |
|
index 88f31bd..39f7060 100644 |
|
--- a/src/polkitbackend/polkitbackendjsauthority.c |
|
+++ b/src/polkitbackend/polkitbackendjsauthority.c |
|
@@ -482,6 +482,7 @@ polkit_backend_js_authority_constructed (GObject *object) |
|
|
|
if (authority->priv->js_global == NULL) |
|
goto fail; |
|
+ JS_AddObjectRoot (authority->priv->cx, &authority->priv->js_global); |
|
|
|
if (!JS_InitStandardClasses (authority->priv->cx, authority->priv->js_global)) |
|
goto fail; |
|
@@ -494,6 +495,7 @@ polkit_backend_js_authority_constructed (GObject *object) |
|
JSPROP_ENUMERATE); |
|
if (authority->priv->js_polkit == NULL) |
|
goto fail; |
|
+ JS_AddObjectRoot (authority->priv->cx, &authority->priv->js_polkit); |
|
|
|
if (!JS_DefineFunctions (authority->priv->cx, |
|
authority->priv->js_polkit, |
|
@@ -572,6 +574,11 @@ polkit_backend_js_authority_finalize (GObject *object) |
|
g_free (authority->priv->dir_monitors); |
|
g_strfreev (authority->priv->rules_dirs); |
|
|
|
+ JS_BeginRequest (authority->priv->cx); |
|
+ JS_RemoveObjectRoot (authority->priv->cx, &authority->priv->js_polkit); |
|
+ JS_RemoveObjectRoot (authority->priv->cx, &authority->priv->js_global); |
|
+ JS_EndRequest (authority->priv->cx); |
|
+ |
|
JS_DestroyContext (authority->priv->cx); |
|
JS_DestroyRuntime (authority->priv->rt); |
|
/* JS_ShutDown (); */ |
|
|
|
commit 2881f8b260c03df29afb0e35e6d1707240f95ad7 |
|
Author: Miloslav Trmač <mitr@redhat.com> |
|
Date: Tue Jul 1 20:00:48 2014 +0200 |
|
|
|
Prevent builds against SpiderMonkey with exact stack rooting |
|
|
|
“Exact stack rooting” means that every on-stack pointer to a JavaScript |
|
value needs to be registered with the runtime. The current code doesn't |
|
do this, so it is not safe to use against a runtime with this |
|
configuration. Luckily this configuration is not default. |
|
|
|
See |
|
https://developer.mozilla.org/en-US/docs/SpiderMonkey/Internals/GC/Exact_Stack_Rooting |
|
and other pages in the wiki for what the conversion would require. |
|
|
|
https://bugs.freedesktop.org/show_bug.cgi?id=69501 |
|
|
|
diff --git a/src/polkitbackend/polkitbackendjsauthority.c b/src/polkitbackend/polkitbackendjsauthority.c |
|
index 39f7060..22812a6 100644 |
|
--- a/src/polkitbackend/polkitbackendjsauthority.c |
|
+++ b/src/polkitbackend/polkitbackendjsauthority.c |
|
@@ -43,6 +43,13 @@ |
|
|
|
#include "initjs.h" /* init.js */ |
|
|
|
+#ifdef JSGC_USE_EXACT_ROOTING |
|
+/* See https://developer.mozilla.org/en-US/docs/SpiderMonkey/Internals/GC/Exact_Stack_Rooting |
|
+ * for more information about exact stack rooting. |
|
+ */ |
|
+#error "This code is not safe in SpiderMonkey exact stack rooting configurations" |
|
+#endif |
|
+ |
|
/** |
|
* SECTION:polkitbackendjsauthority |
|
* @title: PolkitBackendJsAuthority |
|
|
|
commit b544f10dd469ae3cfedc026db71ee76e9ef511a2 |
|
Author: Miloslav Trmač <mitr@redhat.com> |
|
Date: Tue Jul 1 20:00:48 2014 +0200 |
|
|
|
Clear the JS operation callback before invoking JS in the callback |
|
|
|
Setting the callback to NULL is required by |
|
https://developer.mozilla.org/en-US/docs/SpiderMonkey/JSAPI_Reference/JS_SetOperationCallback |
|
to avoid the possibility of recursion. |
|
|
|
https://bugs.freedesktop.org/show_bug.cgi?id=69501 |
|
|
|
diff --git a/src/polkitbackend/polkitbackendjsauthority.c b/src/polkitbackend/polkitbackendjsauthority.c |
|
index 22812a6..8a0a097 100644 |
|
--- a/src/polkitbackend/polkitbackendjsauthority.c |
|
+++ b/src/polkitbackend/polkitbackendjsauthority.c |
|
@@ -961,9 +961,11 @@ js_operation_callback (JSContext *cx) |
|
polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority), "Terminating runaway script"); |
|
|
|
/* Throw an exception - this way the JS code can ignore the runaway script handling */ |
|
+ JS_SetOperationCallback (authority->priv->cx, NULL); |
|
val_str = JS_NewStringCopyZ (cx, "Terminating runaway script"); |
|
val = STRING_TO_JSVAL (val_str); |
|
JS_SetPendingException (authority->priv->cx, val); |
|
+ JS_SetOperationCallback (authority->priv->cx, js_operation_callback); |
|
return JS_FALSE; |
|
} |
|
|
|
|
|
commit d7da6a23766e9c95fa333a0a9c742f7397c0ad22 |
|
Author: Miloslav Trmač <mitr@redhat.com> |
|
Date: Tue Jul 1 20:00:48 2014 +0200 |
|
|
|
Fix spurious timeout exceptions on GC |
|
|
|
The JS “Operation callback” can be called by the runtime for other |
|
reasons, not only when we trigger it by a timeout—notably as part of GC. |
|
So, make sure to only raise an exception if there actually was a |
|
timeout. |
|
|
|
Adding a whole extra mutex to protect a single boolean is somewhat of an |
|
overkill, but better than worrying about “subtle bugs and occasionally |
|
undefined behaviour” the g_atomic_* API is warning about. |
|
|
|
https://bugs.freedesktop.org/show_bug.cgi?id=69501 |
|
also |
|
https://bugs.freedesktop.org/show_bug.cgi?id=77524 |
|
|
|
diff --git a/src/polkitbackend/polkitbackendjsauthority.c b/src/polkitbackend/polkitbackendjsauthority.c |
|
index 8a0a097..097dcc5 100644 |
|
--- a/src/polkitbackend/polkitbackendjsauthority.c |
|
+++ b/src/polkitbackend/polkitbackendjsauthority.c |
|
@@ -80,6 +80,8 @@ struct _PolkitBackendJsAuthorityPrivate |
|
GMainContext *rkt_context; |
|
GMainLoop *rkt_loop; |
|
GSource *rkt_source; |
|
+ GMutex rkt_timeout_pending_mutex; |
|
+ gboolean rkt_timeout_pending; |
|
|
|
/* A list of JSObject instances */ |
|
GList *scripts; |
|
@@ -528,6 +530,7 @@ polkit_backend_js_authority_constructed (GObject *object) |
|
|
|
g_mutex_init (&authority->priv->rkt_init_mutex); |
|
g_cond_init (&authority->priv->rkt_init_cond); |
|
+ g_mutex_init (&authority->priv->rkt_timeout_pending_mutex); |
|
|
|
authority->priv->runaway_killer_thread = g_thread_new ("runaway-killer-thread", |
|
runaway_killer_thread_func, |
|
@@ -563,6 +566,7 @@ polkit_backend_js_authority_finalize (GObject *object) |
|
|
|
g_mutex_clear (&authority->priv->rkt_init_mutex); |
|
g_cond_clear (&authority->priv->rkt_init_cond); |
|
+ g_mutex_clear (&authority->priv->rkt_timeout_pending_mutex); |
|
|
|
/* shut down the killer thread */ |
|
g_assert (authority->priv->rkt_loop != NULL); |
|
@@ -957,6 +961,18 @@ js_operation_callback (JSContext *cx) |
|
JSString *val_str; |
|
jsval val; |
|
|
|
+ /* This callback can be called by the runtime at any time without us causing |
|
+ * it by JS_TriggerOperationCallback(). |
|
+ */ |
|
+ g_mutex_lock (&authority->priv->rkt_timeout_pending_mutex); |
|
+ if (!authority->priv->rkt_timeout_pending) |
|
+ { |
|
+ g_mutex_unlock (&authority->priv->rkt_timeout_pending_mutex); |
|
+ return JS_TRUE; |
|
+ } |
|
+ authority->priv->rkt_timeout_pending = FALSE; |
|
+ g_mutex_unlock (&authority->priv->rkt_timeout_pending_mutex); |
|
+ |
|
/* Log that we are terminating the script */ |
|
polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority), "Terminating runaway script"); |
|
|
|
@@ -974,6 +990,10 @@ rkt_on_timeout (gpointer user_data) |
|
{ |
|
PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (user_data); |
|
|
|
+ g_mutex_lock (&authority->priv->rkt_timeout_pending_mutex); |
|
+ authority->priv->rkt_timeout_pending = TRUE; |
|
+ g_mutex_unlock (&authority->priv->rkt_timeout_pending_mutex); |
|
+ |
|
/* Supposedly this is thread-safe... */ |
|
#if JS_VERSION == 186 |
|
JS_TriggerOperationCallback (authority->priv->rt); |
|
@@ -993,6 +1013,9 @@ runaway_killer_setup (PolkitBackendJsAuthority *authority) |
|
g_assert (authority->priv->rkt_source == NULL); |
|
|
|
/* set-up timer for runaway scripts, will be executed in runaway_killer_thread */ |
|
+ g_mutex_lock (&authority->priv->rkt_timeout_pending_mutex); |
|
+ authority->priv->rkt_timeout_pending = FALSE; |
|
+ g_mutex_unlock (&authority->priv->rkt_timeout_pending_mutex); |
|
authority->priv->rkt_source = g_timeout_source_new_seconds (15); |
|
g_source_set_callback (authority->priv->rkt_source, rkt_on_timeout, authority, NULL); |
|
g_source_attach (authority->priv->rkt_source, authority->priv->rkt_context);
|
|
|