Merge pull request #1581 from dsnopek/classdb-add-virtual-method-arg-metadata-size

Fix crash in `ClassDB::add_virtual_method()` if arguments metadata is the wrong size
pull/1638/head
David Snopek 2024-11-05 09:18:01 -06:00 committed by GitHub
commit 253e095c81
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 6 additions and 1 deletions

View File

@ -353,9 +353,14 @@ void ClassDB::add_virtual_method(const StringName &p_class, const MethodInfo &p_
if (mi.argument_count > 0) { if (mi.argument_count > 0) {
mi.arguments = (GDExtensionPropertyInfo *)memalloc(sizeof(GDExtensionPropertyInfo) * mi.argument_count); mi.arguments = (GDExtensionPropertyInfo *)memalloc(sizeof(GDExtensionPropertyInfo) * mi.argument_count);
mi.arguments_metadata = (GDExtensionClassMethodArgumentMetadata *)memalloc(sizeof(GDExtensionClassMethodArgumentMetadata) * mi.argument_count); mi.arguments_metadata = (GDExtensionClassMethodArgumentMetadata *)memalloc(sizeof(GDExtensionClassMethodArgumentMetadata) * mi.argument_count);
if (mi.argument_count != p_method.arguments_metadata.size()) {
WARN_PRINT("Mismatch argument metadata count for virtual method: " + String(p_class) + "::" + p_method.name);
}
for (uint32_t i = 0; i < mi.argument_count; i++) { for (uint32_t i = 0; i < mi.argument_count; i++) {
mi.arguments[i] = p_method.arguments[i]._to_gdextension(); mi.arguments[i] = p_method.arguments[i]._to_gdextension();
mi.arguments_metadata[i] = p_method.arguments_metadata[i]; if (i < p_method.arguments_metadata.size()) {
mi.arguments_metadata[i] = p_method.arguments_metadata[i];
}
} }
} else { } else {
mi.arguments = nullptr; mi.arguments = nullptr;