Skip to content

Commit eb81e8b

Browse files
committed
Prevent read-after-free in the queued CallableCustomStaticMethodPointer.
1 parent bb63963 commit eb81e8b

File tree

1 file changed

+0
-24
lines changed

1 file changed

+0
-24
lines changed

core/object/callable_method_pointer.h

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -81,35 +81,27 @@ template <class T, class... P>
8181
class CallableCustomMethodPointer : public CallableCustomMethodPointerBase {
8282
struct Data {
8383
T *instance;
84-
#ifdef DEBUG_ENABLED
8584
uint64_t object_id;
86-
#endif
8785
void (T::*method)(P...);
8886
} data;
8987

9088
public:
9189
virtual ObjectID get_object() const {
92-
#ifdef DEBUG_ENABLED
9390
if (ObjectDB::get_instance(ObjectID(data.object_id)) == nullptr) {
9491
return ObjectID();
9592
}
96-
#endif
9793
return data.instance->get_instance_id();
9894
}
9995

10096
virtual void call(const Variant **p_arguments, int p_argcount, Variant &r_return_value, Callable::CallError &r_call_error) const {
101-
#ifdef DEBUG_ENABLED
10297
ERR_FAIL_NULL_MSG(ObjectDB::get_instance(ObjectID(data.object_id)), "Invalid Object id '" + uitos(data.object_id) + "', can't call method.");
103-
#endif
10498
call_with_variant_args(data.instance, data.method, p_arguments, p_argcount, r_call_error);
10599
}
106100

107101
CallableCustomMethodPointer(T *p_instance, void (T::*p_method)(P...)) {
108102
memset(&data, 0, sizeof(Data)); // Clear beforehand, may have padding bytes.
109103
data.instance = p_instance;
110-
#ifdef DEBUG_ENABLED
111104
data.object_id = p_instance->get_instance_id();
112-
#endif
113105
data.method = p_method;
114106
_setup((uint32_t *)&data, sizeof(Data));
115107
}
@@ -135,36 +127,28 @@ template <class T, class R, class... P>
135127
class CallableCustomMethodPointerRet : public CallableCustomMethodPointerBase {
136128
struct Data {
137129
T *instance;
138-
#ifdef DEBUG_ENABLED
139130
uint64_t object_id;
140-
#endif
141131
R(T::*method)
142132
(P...);
143133
} data;
144134

145135
public:
146136
virtual ObjectID get_object() const {
147-
#ifdef DEBUG_ENABLED
148137
if (ObjectDB::get_instance(ObjectID(data.object_id)) == nullptr) {
149138
return ObjectID();
150139
}
151-
#endif
152140
return data.instance->get_instance_id();
153141
}
154142

155143
virtual void call(const Variant **p_arguments, int p_argcount, Variant &r_return_value, Callable::CallError &r_call_error) const {
156-
#ifdef DEBUG_ENABLED
157144
ERR_FAIL_NULL_MSG(ObjectDB::get_instance(ObjectID(data.object_id)), "Invalid Object id '" + uitos(data.object_id) + "', can't call method.");
158-
#endif
159145
call_with_variant_args_ret(data.instance, data.method, p_arguments, p_argcount, r_return_value, r_call_error);
160146
}
161147

162148
CallableCustomMethodPointerRet(T *p_instance, R (T::*p_method)(P...)) {
163149
memset(&data, 0, sizeof(Data)); // Clear beforehand, may have padding bytes.
164150
data.instance = p_instance;
165-
#ifdef DEBUG_ENABLED
166151
data.object_id = p_instance->get_instance_id();
167-
#endif
168152
data.method = p_method;
169153
_setup((uint32_t *)&data, sizeof(Data));
170154
}
@@ -190,36 +174,28 @@ template <class T, class R, class... P>
190174
class CallableCustomMethodPointerRetC : public CallableCustomMethodPointerBase {
191175
struct Data {
192176
T *instance;
193-
#ifdef DEBUG_ENABLED
194177
uint64_t object_id;
195-
#endif
196178
R(T::*method)
197179
(P...) const;
198180
} data;
199181

200182
public:
201183
virtual ObjectID get_object() const override {
202-
#ifdef DEBUG_ENABLED
203184
if (ObjectDB::get_instance(ObjectID(data.object_id)) == nullptr) {
204185
return ObjectID();
205186
}
206-
#endif
207187
return data.instance->get_instance_id();
208188
}
209189

210190
virtual void call(const Variant **p_arguments, int p_argcount, Variant &r_return_value, Callable::CallError &r_call_error) const override {
211-
#ifdef DEBUG_ENABLED
212191
ERR_FAIL_NULL_MSG(ObjectDB::get_instance(ObjectID(data.object_id)), "Invalid Object id '" + uitos(data.object_id) + "', can't call method.");
213-
#endif
214192
call_with_variant_args_retc(data.instance, data.method, p_arguments, p_argcount, r_return_value, r_call_error);
215193
}
216194

217195
CallableCustomMethodPointerRetC(T *p_instance, R (T::*p_method)(P...) const) {
218196
memset(&data, 0, sizeof(Data)); // Clear beforehand, may have padding bytes.
219197
data.instance = p_instance;
220-
#ifdef DEBUG_ENABLED
221198
data.object_id = p_instance->get_instance_id();
222-
#endif
223199
data.method = p_method;
224200
_setup((uint32_t *)&data, sizeof(Data));
225201
}

0 commit comments

Comments
 (0)