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