@@ -577,6 +577,48 @@ hfsplus_btree_lock_class(struct hfs_btree *tree)
577
577
return class ;
578
578
}
579
579
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
+
580
622
/* compatibility */
581
623
#define hfsp_mt2ut (t ) (struct timespec64){ .tv_sec = __hfsp_mt2ut(t) }
582
624
#define hfsp_ut2mt (t ) __hfsp_ut2mt((t).tv_sec)
0 commit comments