15
15
16
16
#include "btree.h"
17
17
18
+ static inline
19
+ bool is_bnode_offset_valid (struct hfs_bnode * node , int off )
20
+ {
21
+ bool is_valid = off < node -> tree -> node_size ;
22
+
23
+ if (!is_valid ) {
24
+ pr_err ("requested invalid offset: "
25
+ "NODE: id %u, type %#x, height %u, "
26
+ "node_size %u, offset %d\n" ,
27
+ node -> this , node -> type , node -> height ,
28
+ node -> tree -> node_size , off );
29
+ }
30
+
31
+ return is_valid ;
32
+ }
33
+
34
+ static inline
35
+ int check_and_correct_requested_length (struct hfs_bnode * node , int off , int len )
36
+ {
37
+ unsigned int node_size ;
38
+
39
+ if (!is_bnode_offset_valid (node , off ))
40
+ return 0 ;
41
+
42
+ node_size = node -> tree -> node_size ;
43
+
44
+ if ((off + len ) > node_size ) {
45
+ int new_len = (int )node_size - off ;
46
+
47
+ pr_err ("requested length has been corrected: "
48
+ "NODE: id %u, type %#x, height %u, "
49
+ "node_size %u, offset %d, "
50
+ "requested_len %d, corrected_len %d\n" ,
51
+ node -> this , node -> type , node -> height ,
52
+ node -> tree -> node_size , off , len , new_len );
53
+
54
+ return new_len ;
55
+ }
56
+
57
+ return len ;
58
+ }
59
+
18
60
void hfs_bnode_read (struct hfs_bnode * node , void * buf , int off , int len )
19
61
{
20
62
struct page * page ;
21
63
int pagenum ;
22
64
int bytes_read ;
23
65
int bytes_to_read ;
24
66
67
+ if (!is_bnode_offset_valid (node , off ))
68
+ return ;
69
+
70
+ if (len == 0 ) {
71
+ pr_err ("requested zero length: "
72
+ "NODE: id %u, type %#x, height %u, "
73
+ "node_size %u, offset %d, len %d\n" ,
74
+ node -> this , node -> type , node -> height ,
75
+ node -> tree -> node_size , off , len );
76
+ return ;
77
+ }
78
+
79
+ len = check_and_correct_requested_length (node , off , len );
80
+
25
81
off += node -> page_offset ;
26
82
pagenum = off >> PAGE_SHIFT ;
27
83
off &= ~PAGE_MASK ; /* compute page offset for the first page */
@@ -80,6 +136,20 @@ void hfs_bnode_write(struct hfs_bnode *node, void *buf, int off, int len)
80
136
{
81
137
struct page * page ;
82
138
139
+ if (!is_bnode_offset_valid (node , off ))
140
+ return ;
141
+
142
+ if (len == 0 ) {
143
+ pr_err ("requested zero length: "
144
+ "NODE: id %u, type %#x, height %u, "
145
+ "node_size %u, offset %d, len %d\n" ,
146
+ node -> this , node -> type , node -> height ,
147
+ node -> tree -> node_size , off , len );
148
+ return ;
149
+ }
150
+
151
+ len = check_and_correct_requested_length (node , off , len );
152
+
83
153
off += node -> page_offset ;
84
154
page = node -> page [0 ];
85
155
@@ -104,6 +174,20 @@ void hfs_bnode_clear(struct hfs_bnode *node, int off, int len)
104
174
{
105
175
struct page * page ;
106
176
177
+ if (!is_bnode_offset_valid (node , off ))
178
+ return ;
179
+
180
+ if (len == 0 ) {
181
+ pr_err ("requested zero length: "
182
+ "NODE: id %u, type %#x, height %u, "
183
+ "node_size %u, offset %d, len %d\n" ,
184
+ node -> this , node -> type , node -> height ,
185
+ node -> tree -> node_size , off , len );
186
+ return ;
187
+ }
188
+
189
+ len = check_and_correct_requested_length (node , off , len );
190
+
107
191
off += node -> page_offset ;
108
192
page = node -> page [0 ];
109
193
@@ -119,6 +203,10 @@ void hfs_bnode_copy(struct hfs_bnode *dst_node, int dst,
119
203
hfs_dbg (BNODE_MOD , "copybytes: %u,%u,%u\n" , dst , src , len );
120
204
if (!len )
121
205
return ;
206
+
207
+ len = check_and_correct_requested_length (src_node , src , len );
208
+ len = check_and_correct_requested_length (dst_node , dst , len );
209
+
122
210
src += src_node -> page_offset ;
123
211
dst += dst_node -> page_offset ;
124
212
src_page = src_node -> page [0 ];
@@ -136,6 +224,10 @@ void hfs_bnode_move(struct hfs_bnode *node, int dst, int src, int len)
136
224
hfs_dbg (BNODE_MOD , "movebytes: %u,%u,%u\n" , dst , src , len );
137
225
if (!len )
138
226
return ;
227
+
228
+ len = check_and_correct_requested_length (node , src , len );
229
+ len = check_and_correct_requested_length (node , dst , len );
230
+
139
231
src += node -> page_offset ;
140
232
dst += node -> page_offset ;
141
233
page = node -> page [0 ];
0 commit comments