@@ -86,9 +86,15 @@ String charsequence_to_string(JNIEnv *p_env, jobject p_charsequence) {
86
86
return result;
87
87
}
88
88
89
- jvalret _variant_to_jvalue (JNIEnv *env, Variant::Type p_type, const Variant *p_arg, bool force_jobject) {
89
+ jvalret _variant_to_jvalue (JNIEnv *env, Variant::Type p_type, const Variant *p_arg, bool force_jobject, int p_depth ) {
90
90
jvalret v;
91
91
92
+ if (p_depth > Variant::MAX_RECURSION_DEPTH) {
93
+ ERR_PRINT (" Variant is too deep! Bailing." );
94
+ v.val .i = 0 ;
95
+ return v;
96
+ }
97
+
92
98
switch (p_type) {
93
99
case Variant::BOOL: {
94
100
if (force_jobject) {
@@ -185,7 +191,7 @@ jvalret _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant *p_a
185
191
186
192
for (int j = 0 ; j < keys.size (); j++) {
187
193
Variant var = dict[keys[j]];
188
- jvalret valret = _variant_to_jvalue (env, var.get_type (), &var, true );
194
+ jvalret valret = _variant_to_jvalue (env, var.get_type (), &var, true , p_depth + 1 );
189
195
env->SetObjectArrayElement (jvalues, j, valret.val .l );
190
196
if (valret.obj ) {
191
197
env->DeleteLocalRef (valret.obj );
@@ -208,7 +214,7 @@ jvalret _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant *p_a
208
214
209
215
for (int j = 0 ; j < array.size (); j++) {
210
216
Variant var = array[j];
211
- jvalret valret = _variant_to_jvalue (env, var.get_type (), &var, true );
217
+ jvalret valret = _variant_to_jvalue (env, var.get_type (), &var, true , p_depth + 1 );
212
218
env->SetObjectArrayElement (arr, j, valret.val .l );
213
219
if (valret.obj ) {
214
220
env->DeleteLocalRef (valret.obj );
@@ -297,7 +303,9 @@ String _get_class_name(JNIEnv *env, jclass cls, bool *array) {
297
303
return name;
298
304
}
299
305
300
- Variant _jobject_to_variant (JNIEnv *env, jobject obj) {
306
+ Variant _jobject_to_variant (JNIEnv *env, jobject obj, int p_depth) {
307
+ ERR_FAIL_COND_V_MSG (p_depth > Variant::MAX_RECURSION_DEPTH, Variant (), " Variant is too deep! Bailing." );
308
+
301
309
if (obj == nullptr ) {
302
310
return Variant ();
303
311
}
@@ -434,7 +442,7 @@ Variant _jobject_to_variant(JNIEnv *env, jobject obj) {
434
442
435
443
for (int i = 0 ; i < objCount; i++) {
436
444
jobject jobj = env->GetObjectArrayElement (arr, i);
437
- Variant v = _jobject_to_variant (env, jobj);
445
+ Variant v = _jobject_to_variant (env, jobj, p_depth + 1 );
438
446
varr.push_back (v);
439
447
env->DeleteLocalRef (jobj);
440
448
}
@@ -448,13 +456,13 @@ Variant _jobject_to_variant(JNIEnv *env, jobject obj) {
448
456
jmethodID get_keys = env->GetMethodID (oclass, " get_keys" , " ()[Ljava/lang/String;" );
449
457
jobjectArray arr = (jobjectArray)env->CallObjectMethod (obj, get_keys);
450
458
451
- PackedStringArray keys = _jobject_to_variant (env, arr);
459
+ PackedStringArray keys = _jobject_to_variant (env, arr, p_depth + 1 );
452
460
env->DeleteLocalRef (arr);
453
461
454
462
jmethodID get_values = env->GetMethodID (oclass, " get_values" , " ()[Ljava/lang/Object;" );
455
463
arr = (jobjectArray)env->CallObjectMethod (obj, get_values);
456
464
457
- Array vals = _jobject_to_variant (env, arr);
465
+ Array vals = _jobject_to_variant (env, arr, p_depth + 1 );
458
466
env->DeleteLocalRef (arr);
459
467
460
468
for (int i = 0 ; i < keys.size (); i++) {
0 commit comments