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