From 6047f1adcb0ebda19c28c067efcaa38fed565123 Mon Sep 17 00:00:00 2001 From: Andrew Kaster Date: Tue, 9 Jan 2024 16:01:28 -0700 Subject: [PATCH] LibJS: Ensure JS::Date has a key function and its vtable is in LibJS Without a key function, the vtable for this class can be emitted into every shared object or executable that needs it. This can cause bugs and bad behavior when trying to access the vtable or RTTI for the class. This is most easily seen when trying to call ``is``, which currently will do a dynamic_cast. Based on compiler, linker and loader choices about ordering, it's possible that the code checking the RTTI and the code that created the object could have a different vtable and type_info in mind, causing false negatives for the ``is`` check. --- Userland/Libraries/LibJS/Runtime/Date.cpp | 2 ++ Userland/Libraries/LibJS/Runtime/Date.h | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibJS/Runtime/Date.cpp b/Userland/Libraries/LibJS/Runtime/Date.cpp index b29830cace..a4787ee438 100644 --- a/Userland/Libraries/LibJS/Runtime/Date.cpp +++ b/Userland/Libraries/LibJS/Runtime/Date.cpp @@ -36,6 +36,8 @@ Date::Date(double date_value, Object& prototype) { } +Date::~Date() = default; + ErrorOr Date::iso_date_string() const { int year = year_from_time(m_date_value); diff --git a/Userland/Libraries/LibJS/Runtime/Date.h b/Userland/Libraries/LibJS/Runtime/Date.h index 5f7d64e32e..2dae8eead9 100644 --- a/Userland/Libraries/LibJS/Runtime/Date.h +++ b/Userland/Libraries/LibJS/Runtime/Date.h @@ -19,7 +19,8 @@ class Date final : public Object { public: static NonnullGCPtr create(Realm&, double date_value); - virtual ~Date() override = default; + // Out of line to ensure we have a key function + virtual ~Date() override; double date_value() const { return m_date_value; } void set_date_value(double value) { m_date_value = value; }