Przeglądaj źródła

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<JS::Date>``, 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.
Andrew Kaster 1 rok temu
rodzic
commit
6047f1adcb

+ 2 - 0
Userland/Libraries/LibJS/Runtime/Date.cpp

@@ -36,6 +36,8 @@ Date::Date(double date_value, Object& prototype)
 {
 {
 }
 }
 
 
+Date::~Date() = default;
+
 ErrorOr<String> Date::iso_date_string() const
 ErrorOr<String> Date::iso_date_string() const
 {
 {
     int year = year_from_time(m_date_value);
     int year = year_from_time(m_date_value);

+ 2 - 1
Userland/Libraries/LibJS/Runtime/Date.h

@@ -19,7 +19,8 @@ class Date final : public Object {
 public:
 public:
     static NonnullGCPtr<Date> create(Realm&, double date_value);
     static NonnullGCPtr<Date> 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; }
     double date_value() const { return m_date_value; }
     void set_date_value(double value) { m_date_value = value; }
     void set_date_value(double value) { m_date_value = value; }