@@ -6804,34 +6804,36 @@ static RBinJavaAnnotationsArray *r_bin_java_annotation_array_new(RBinJavaObj *bi
68046804 return annotation_array ;
68056805}
68066806
6807- static RBinJavaAttrInfo * r_bin_java_rtv_annotations_attr_new (RBinJavaObj * bin , ut8 * buffer , ut64 sz , ut64 buf_offset ) {
6808- ut32 i = 0 ;
6809- ut64 offset = 0 ;
6807+ static RBinJavaAttrInfo * r_bin_java_annotations_attr_new (RBinJavaObj * bin , ut8 * buffer , ut64 sz , ut64 buf_offset , ut8 type ) {
68106808 if (sz < 8 ) {
68116809 return NULL ;
68126810 }
68136811 RBinJavaAttrInfo * attr = r_bin_java_default_attr_new (bin , buffer , sz , buf_offset );
6814- offset += 6 ;
6815- if (attr ) {
6816- attr -> type = R_BIN_JAVA_ATTR_TYPE_RUNTIME_VISIBLE_ANNOTATION_ATTR ;
6817- attr -> info .annotation_array .num_annotations = R_BIN_JAVA_USHORT (buffer , offset );
6818- offset += 2 ;
6819- attr -> info .annotation_array .annotations = r_list_newf (r_bin_java_annotation_free );
6820- for (i = 0 ; i < attr -> info .annotation_array .num_annotations ; i ++ ) {
6821- if (offset >= sz ) {
6822- break ;
6823- }
6824- RBinJavaAnnotation * annotation = r_bin_java_annotation_new (bin , buffer + offset , sz - offset , buf_offset + offset );
6825- if (annotation ) {
6826- offset += annotation -> size ;
6827- r_list_append (attr -> info .annotation_array .annotations , (void * )annotation );
6828- }
6812+ ut64 offset = 6 ;
6813+ attr -> type = type ;
6814+ attr -> info .annotation_array .num_annotations = R_BIN_JAVA_USHORT (buffer , offset );
6815+ offset += 2 ;
6816+ attr -> info .annotation_array .annotations = r_list_newf (r_bin_java_annotation_free );
6817+ // clamp tainted count by remaining buffer (each annotation needs at least 8 bytes)
6818+ const ut64 nmax = (sz - offset ) / 8 ;
6819+ const ut32 n = R_MIN (attr -> info .annotation_array .num_annotations , nmax );
6820+ ut32 i ;
6821+ for (i = 0 ; i < n ; i ++ ) {
6822+ RBinJavaAnnotation * annotation = r_bin_java_annotation_new (bin , buffer + offset , sz - offset , buf_offset + offset );
6823+ if (!annotation ) {
6824+ break ;
68296825 }
6830- attr -> size = offset ;
6826+ offset += annotation -> size ;
6827+ r_list_append (attr -> info .annotation_array .annotations , annotation );
68316828 }
6829+ attr -> size = offset ;
68326830 return attr ;
68336831}
68346832
6833+ static RBinJavaAttrInfo * r_bin_java_rtv_annotations_attr_new (RBinJavaObj * bin , ut8 * buffer , ut64 sz , ut64 buf_offset ) {
6834+ return r_bin_java_annotations_attr_new (bin , buffer , sz , buf_offset , R_BIN_JAVA_ATTR_TYPE_RUNTIME_VISIBLE_ANNOTATION_ATTR );
6835+ }
6836+
68356837static ut64 r_bin_java_annotation_array_calc_size (RBinJavaAnnotationsArray * annotation_array ) {
68366838 ut64 size = 0 ;
68376839 RListIter * iter = NULL , * iter_tmp = NULL ;
@@ -6859,32 +6861,7 @@ static ut64 r_bin_java_rtv_annotations_attr_calc_size(RBinJavaAttrInfo *attr) {
68596861}
68606862
68616863static RBinJavaAttrInfo * r_bin_java_rti_annotations_attr_new (RBinJavaObj * bin , ut8 * buffer , ut64 sz , ut64 buf_offset ) {
6862- ut32 i = 0 ;
6863- ut64 offset = 0 ;
6864- if (sz < 8 ) {
6865- return NULL ;
6866- }
6867- RBinJavaAttrInfo * attr = r_bin_java_default_attr_new (bin , buffer , sz , buf_offset );
6868- offset += 6 ;
6869- if (attr ) {
6870- attr -> type = R_BIN_JAVA_ATTR_TYPE_RUNTIME_INVISIBLE_ANNOTATION_ATTR ;
6871- attr -> info .annotation_array .num_annotations = R_BIN_JAVA_USHORT (buffer , offset );
6872- offset += 2 ;
6873- attr -> info .annotation_array .annotations = r_list_newf (r_bin_java_annotation_free );
6874- for (i = 0 ; i < attr -> info .annotation_array .num_annotations ; i ++ ) {
6875- if (offset >= sz ) {
6876- break ;
6877- }
6878- RBinJavaAnnotation * annotation = r_bin_java_annotation_new (bin , buffer + offset , sz - offset , buf_offset + offset );
6879- if (!annotation ) {
6880- break ;
6881- }
6882- offset += annotation -> size ;
6883- r_list_append (attr -> info .annotation_array .annotations , (void * )annotation );
6884- }
6885- attr -> size = offset ;
6886- }
6887- return attr ;
6864+ return r_bin_java_annotations_attr_new (bin , buffer , sz , buf_offset , R_BIN_JAVA_ATTR_TYPE_RUNTIME_INVISIBLE_ANNOTATION_ATTR );
68886865}
68896866
68906867static ut64 r_bin_java_rti_annotations_attr_calc_size (RBinJavaAttrInfo * attr ) {
0 commit comments