[gjs: 1/2] overrides/GLib: Guard Error.new_literal against invalid domains
- From: Philip Chimento <pchimento src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gjs: 1/2] overrides/GLib: Guard Error.new_literal against invalid domains
- Date: Fri, 13 Aug 2021 04:35:27 +0000 (UTC)
commit 4f847688ede096378406ed7be3e34ebdb55e9fde
Author: Florian Müllner <fmuellner gnome org>
Date: Wed Aug 11 14:14:58 2021 +0200
overrides/GLib: Guard Error.new_literal against invalid domains
g_error_new_literal() only enforces the precondition that the domain
must be greater than 0, but will crash later if it doesn't correspond
to a valid GQuark.
We can check for that in an override and throw an error if it doesn't.
(If the GQuark is valid, it may or may not correspond to an error domain.
We can't tell, but while a domain of `GLib.quark_from_string('void')` is
weird, it doesn't do any harm)
https://gitlab.gnome.org/GNOME/gjs/-/issues/433
installed-tests/js/testExceptions.js | 22 +++++++++++-----------
modules/core/overrides/GLib.js | 10 ++++++++++
2 files changed, 21 insertions(+), 11 deletions(-)
---
diff --git a/installed-tests/js/testExceptions.js b/installed-tests/js/testExceptions.js
index 662b5297..fbc32bc2 100644
--- a/installed-tests/js/testExceptions.js
+++ b/installed-tests/js/testExceptions.js
@@ -206,16 +206,16 @@ describe('thrown GError', function () {
});
});
-describe('Returned GError', function () {
- it('can be nullable', function () {
- // expect a critical about passing in an invalid error domain, but this
- // should not crash or log a critical about freeing a null GError
- GLib.test_expect_message('GLib', GLib.LogLevelFlags.LEVEL_CRITICAL,
- "g_error_new_literal: assertion 'domain != 0' failed");
-
- expect(GLib.Error.new_literal(0, 0, 'message')).toBeNull();
-
- GLib.test_assert_expected_messages_internal('GLib', 'testExceptions.js',
- 0, 'testGErrorMessages');
+describe('GError.new_literal', function () {
+ it('constructs a valid GLib.Error', function () {
+ const e = GLib.Error.new_literal(
+ Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED, 'message');
+ expect(e instanceof GLib.Error).toBeTruthy();
+ expect(e.code).toEqual(Gio.IOErrorEnum.FAILED);
+ expect(e.message).toEqual('message');
+ });
+ it('does not accept invalid domains', function () {
+ expect(() => GLib.Error.new_literal(0, 0, 'message'))
+ .toThrowError(/0 is not a valid domain/);
});
});
diff --git a/modules/core/overrides/GLib.js b/modules/core/overrides/GLib.js
index e4dca1a1..81bc1994 100644
--- a/modules/core/overrides/GLib.js
+++ b/modules/core/overrides/GLib.js
@@ -268,6 +268,16 @@ function _init() {
return false;
};
+ // Guard against domains that aren't valid quarks and would lead
+ // to a crash
+ const quarkToString = this.quark_to_string;
+ const realNewLiteral = this.Error.new_literal;
+ this.Error.new_literal = function (domain, code, message) {
+ if (quarkToString(domain) === null)
+ throw new TypeError(`Error.new_literal: ${domain} is not a valid domain`);
+ return realNewLiteral(domain, code, message);
+ };
+
this.Variant._new_internal = function (sig, value) {
let signature = Array.prototype.slice.call(sig);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]