@@ -581,6 +581,48 @@ hfsplus_btree_lock_class(struct hfs_btree *tree)
581581 return class ;
582582}
583583
584+ static inline
585+ bool is_bnode_offset_valid (struct hfs_bnode * node , int off )
586+ {
587+ bool is_valid = off < node -> tree -> node_size ;
588+
589+ if (!is_valid ) {
590+ pr_err ("requested invalid offset: "
591+ "NODE: id %u, type %#x, height %u, "
592+ "node_size %u, offset %d\n" ,
593+ node -> this , node -> type , node -> height ,
594+ node -> tree -> node_size , off );
595+ }
596+
597+ return is_valid ;
598+ }
599+
600+ static inline
601+ int check_and_correct_requested_length (struct hfs_bnode * node , int off , int len )
602+ {
603+ unsigned int node_size ;
604+
605+ if (!is_bnode_offset_valid (node , off ))
606+ return 0 ;
607+
608+ node_size = node -> tree -> node_size ;
609+
610+ if ((off + len ) > node_size ) {
611+ int new_len = (int )node_size - off ;
612+
613+ pr_err ("requested length has been corrected: "
614+ "NODE: id %u, type %#x, height %u, "
615+ "node_size %u, offset %d, "
616+ "requested_len %d, corrected_len %d\n" ,
617+ node -> this , node -> type , node -> height ,
618+ node -> tree -> node_size , off , len , new_len );
619+
620+ return new_len ;
621+ }
622+
623+ return len ;
624+ }
625+
584626/* compatibility */
585627#define hfsp_mt2ut (t ) (struct timespec64){ .tv_sec = __hfsp_mt2ut(t) }
586628#define hfsp_ut2mt (t ) __hfsp_ut2mt((t).tv_sec)
0 commit comments