Browse Source

Fix crash in `ClassDB::add_virtual_method()` if arguments metadata is the wrong size

David Snopek 11 months ago
parent
commit
1e169bb809
1 changed files with 6 additions and 1 deletions
  1. 6 1
      src/core/class_db.cpp

+ 6 - 1
src/core/class_db.cpp

@@ -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;