@@ -939,27 +939,42 @@ static void bof_cb (RInterval itv, const ut8 *data, void *user) {
939939 return ;
940940 }
941941 RInterval ov_itv = r_itv_intersect (itv , bof -> sm -> itv );
942- ut8 * m_data = R_NEWS (ut8 , r_itv_size (ov_itv ));
943- if (!m_data ) {
944- return ;
942+ union {
943+ ut8 data [sizeof (ut8 * )];
944+ ut8 * ptr ;
945+ } m ;
946+ if (R_UNLIKELY (r_itv_size (ov_itv ) > sizeof (ut8 * ))) {
947+ m .ptr = R_NEWS (ut8 , r_itv_size (ov_itv ));
948+ if (!m .ptr ) {
949+ return ;
950+ }
945951 }
946952 const ut8 * o_data = & data [
947953 (r_itv_begin (itv ) < r_itv_begin (ov_itv ))?
948954 (r_itv_begin (ov_itv ) - r_itv_begin (itv )): 0 ];
949955 const ut64 pa = r_itv_begin (ov_itv ) - r_io_map_from (bof -> map ) + bof -> map -> delta ;
950- if (r_io_fd_read_at (bof -> io , bof -> map -> fd , pa , m_data , r_itv_size (ov_itv )) != r_itv_size (ov_itv )) {
956+ if (R_UNLIKELY (r_itv_size (ov_itv ) > sizeof (ut8 * ))) {
957+ if (r_io_fd_read_at (bof -> io , bof -> map -> fd , pa , m .ptr ,
958+ r_itv_size (ov_itv )) != r_itv_size (ov_itv )) {
959+ R_LOG_WARN ("r_io_fd_read_at failed" );
960+ free (m .ptr );
961+ return ;
962+ }
963+ bof -> cb (ov_itv , m .ptr , o_data , bof -> user );
964+ free (m .ptr );
965+ return ;
966+ }
967+ if (r_io_fd_read_at (bof -> io , bof -> map -> fd , pa , m .data , r_itv_size (ov_itv )) != r_itv_size (ov_itv )) {
951968 R_LOG_WARN ("r_io_fd_read_at failed" );
952- free (m_data );
953969 return ;
954970 }
955- bof -> cb (ov_itv , m_data , o_data , bof -> user );
956- free (m_data );
971+ bof -> cb (ov_itv , m .data , o_data , bof -> user );
957972}
958973
959974R_API void r_io_bank_overlay_foreach (RIO * io , const ut32 bankid , RIOOverlayForeach cb , void * user ) {
960975 R_RETURN_IF_FAIL (io && cb );
961976 RIOBank * bank = r_io_bank_get (io , bankid );
962- if (!bank || !bank -> submaps || !bank -> submaps -> size ) {
977+ if (!io -> overlay || ! bank || !bank -> submaps || !bank -> submaps -> size ) {
963978 return ;
964979 }
965980 RRBNode * node = r_crbtree_first_node (bank -> submaps );
0 commit comments