@@ -142,6 +142,9 @@ jclass *number_cls = &number_longValue.class_glob;
142142static struct j_method _boolean_booleanValue ;
143143static jclass * _boolean_cls = & _boolean_booleanValue .class_glob ;
144144
145+ // MapIterableWithSize
146+ static jclass _miws_cls ;
147+
145148static struct j_method _hashmap_init ;
146149static struct j_method _map_put ;
147150struct j_method map_entryset ;
@@ -596,10 +599,10 @@ static jobject _run_rule_common(bool is_byte_buffer, JNIEnv *env, jclass clazz,
596599/*
597600 * Class: io_sqreen_powerwaf_Powerwaf
598601 * Method: runRules
599- * Signature: (Lio/sqreen/powerwaf/PowerwafHandle;Ljava/util/Map ;Lio/sqreen/powerwaf/Powerwaf$Limits;)Lio/sqreen/powerwaf/Powerwaf$ResultWithData;
602+ * Signature: (Lio/sqreen/powerwaf/PowerwafHandle;Ljava/util/Object ;Lio/sqreen/powerwaf/Powerwaf$Limits;)Lio/sqreen/powerwaf/Powerwaf$ResultWithData;
600603 */
601604JNIEXPORT jobject JNICALL
602- Java_io_sqreen_powerwaf_Powerwaf_runRules__Lio_sqreen_powerwaf_PowerwafHandle_2Ljava_util_Map_2Lio_sqreen_powerwaf_Powerwaf_00024Limits_2Lio_sqreen_powerwaf_PowerwafMetrics_2 (
605+ Java_io_sqreen_powerwaf_Powerwaf_runRules__Lio_sqreen_powerwaf_PowerwafHandle_2Ljava_lang_Object_2Lio_sqreen_powerwaf_Powerwaf_00024Limits_2Lio_sqreen_powerwaf_PowerwafMetrics_2 (
603606 JNIEnv * env , jclass clazz , jobject handle_obj , jobject parameters ,
604607 jobject limits_obj , jobject metrics_obj )
605608{
@@ -811,10 +814,10 @@ static jobject _run_additive_common(JNIEnv *env, jobject this,
811814 * Class: io_sqreen_powerwaf_Additive
812815 * Method: runAdditive
813816 * Signature:
814- * (Ljava/util/Map ;Lio/sqreen/powerwaf/Powerwaf$Limits;)Lio/sqreen/powerwaf/Powerwaf$ResultWithData;
817+ * (Ljava/lang/Object ;Lio/sqreen/powerwaf/Powerwaf$Limits;)Lio/sqreen/powerwaf/Powerwaf$ResultWithData;
815818 */
816819JNIEXPORT jobject JNICALL
817- Java_io_sqreen_powerwaf_Additive_runAdditive__Ljava_util_Map_2Lio_sqreen_powerwaf_Powerwaf_00024Limits_2Lio_sqreen_powerwaf_PowerwafMetrics_2 (
820+ Java_io_sqreen_powerwaf_Additive_runAdditive__Ljava_lang_Object_2Lio_sqreen_powerwaf_Powerwaf_00024Limits_2Lio_sqreen_powerwaf_PowerwafMetrics_2 (
818821 JNIEnv * env , jobject this , jobject parameters , jobject limits_obj ,
819822 jobject metrics_obj )
820823{
@@ -1128,17 +1131,18 @@ static bool _cache_single_class_weak(JNIEnv *env,
11281131
11291132static bool _cache_classes (JNIEnv * env )
11301133{
1131- return _cache_single_class_weak (env , "java/lang/RuntimeException" ,
1132- & jcls_rte ) &&
1133- _cache_single_class_weak (env , "java/lang/IllegalArgumentException" ,
1134- & jcls_iae ) &&
1135- _cache_single_class_weak (env , "java/lang/CharSequence" ,
1136- & charSequence_cls ) &&
1137- _cache_single_class_weak (env , "java/nio/Buffer" ,
1138- & buffer_cls ) &&
1139- _cache_single_class_weak (env , "java/nio/CharBuffer" ,
1140- & charBuffer_cls ) &&
1141- _cache_single_class_weak (env , "java/lang/String" , & string_cls );
1134+ return _cache_single_class_weak (env , "java/lang/RuntimeException" ,
1135+ & jcls_rte ) &&
1136+ _cache_single_class_weak (env , "java/lang/IllegalArgumentException" ,
1137+ & jcls_iae ) &&
1138+ _cache_single_class_weak (env , "java/lang/CharSequence" ,
1139+ & charSequence_cls ) &&
1140+ _cache_single_class_weak (env , "java/nio/Buffer" , & buffer_cls ) &&
1141+ _cache_single_class_weak (env , "java/nio/CharBuffer" ,
1142+ & charBuffer_cls ) &&
1143+ _cache_single_class_weak (env , "java/lang/String" , & string_cls ) &&
1144+ _cache_single_class_weak (
1145+ env , "io/sqreen/powerwaf/MapIterableWithSize" , & _miws_cls );
11421146}
11431147
11441148static void _dispose_of_weak_classes (JNIEnv * env )
@@ -1154,6 +1158,7 @@ static void _dispose_of_weak_classes(JNIEnv *env)
11541158 DESTROY_CLASS_REF (charSequence_cls )
11551159 DESTROY_CLASS_REF (buffer_cls )
11561160 DESTROY_CLASS_REF (charBuffer_cls )
1161+ DESTROY_CLASS_REF (_miws_cls )
11571162 // leave jcls_rte for last in OnUnload; we might still need it
11581163}
11591164
@@ -1487,6 +1492,10 @@ static ddwaf_object _convert_checked_ex(JNIEnv *env, bool use_bools,
14871492 JNI (DeleteLocalRef , clazz );
14881493 }
14891494
1495+ // shared between two branches
1496+ jobject entry_set = NULL ;
1497+ jobject entry_set_it ;
1498+
14901499 if (JNI (IsSameObject , obj , NULL )) {
14911500 // replace NULLs with empty maps.
14921501 // DDWAF_OBJ_NULL is actually invalid; it can't be added to containers
@@ -1526,6 +1535,18 @@ static ddwaf_object _convert_checked_ex(JNIEnv *env, bool use_bools,
15261535 goto error ;
15271536 }
15281537 }
1538+ } else if (JNI (IsInstanceOf , obj , _miws_cls )) {
1539+ ddwaf_object_map (& result );
1540+ if (rec_level >= lims -> max_depth ) {
1541+ JAVA_LOG (DDWAF_LOG_DEBUG ,
1542+ "Leaving map empty because max depth of %d "
1543+ "has been reached" ,
1544+ lims -> max_depth );
1545+ goto early_return ;
1546+ }
1547+ JAVA_CALL (entry_set_it , iterable_iterator , obj );
1548+ goto iterator_map_entry ;
1549+
15291550 } else if (JNI (IsInstanceOf , obj , * map_cls )) {
15301551 ddwaf_object_map (& result ); // can't fail
15311552 if (rec_level >= lims -> max_depth ) {
@@ -1536,10 +1557,10 @@ static ddwaf_object _convert_checked_ex(JNIEnv *env, bool use_bools,
15361557 goto early_return ;
15371558 }
15381559
1539- jobject entry_set , entry_set_it ;
15401560 JAVA_CALL (entry_set , map_entryset , obj );
15411561 JAVA_CALL (entry_set_it , iterable_iterator , entry_set );
15421562
1563+ iterator_map_entry :
15431564 while (JNI (CallBooleanMethod , entry_set_it , iterator_hasNext .meth_id )) {
15441565 if (JNI (ExceptionCheck )) {
15451566 goto error ;
@@ -1592,7 +1613,9 @@ static ddwaf_object _convert_checked_ex(JNIEnv *env, bool use_bools,
15921613 }
15931614
15941615 JNI (DeleteLocalRef , entry_set_it );
1595- JNI (DeleteLocalRef , entry_set );
1616+ if (entry_set ) {
1617+ JNI (DeleteLocalRef , entry_set );
1618+ }
15961619
15971620 } else if (JNI (IsInstanceOf , obj , * iterable_cls )) {
15981621 ddwaf_object_array (& result );
0 commit comments