@@ -101,6 +101,10 @@ int attr_load_runs(struct ATTRIB *attr, struct ntfs_inode *ni,
101
101
102
102
asize = le32_to_cpu (attr -> size );
103
103
run_off = le16_to_cpu (attr -> nres .run_off );
104
+
105
+ if (run_off > asize )
106
+ return - EINVAL ;
107
+
104
108
err = run_unpack_ex (run , ni -> mi .sbi , ni -> mi .rno , svcn , evcn ,
105
109
vcn ? * vcn : svcn , Add2Ptr (attr , run_off ),
106
110
asize - run_off );
@@ -1157,6 +1161,10 @@ int attr_load_runs_vcn(struct ntfs_inode *ni, enum ATTR_TYPE type,
1157
1161
}
1158
1162
1159
1163
ro = le16_to_cpu (attr -> nres .run_off );
1164
+
1165
+ if (ro > le32_to_cpu (attr -> size ))
1166
+ return - EINVAL ;
1167
+
1160
1168
err = run_unpack_ex (run , ni -> mi .sbi , ni -> mi .rno , svcn , evcn , svcn ,
1161
1169
Add2Ptr (attr , ro ), le32_to_cpu (attr -> size ) - ro );
1162
1170
if (err < 0 )
@@ -1832,6 +1840,11 @@ int attr_collapse_range(struct ntfs_inode *ni, u64 vbo, u64 bytes)
1832
1840
u16 le_sz ;
1833
1841
u16 roff = le16_to_cpu (attr -> nres .run_off );
1834
1842
1843
+ if (roff > le32_to_cpu (attr -> size )) {
1844
+ err = - EINVAL ;
1845
+ goto out ;
1846
+ }
1847
+
1835
1848
run_unpack_ex (RUN_DEALLOCATE , sbi , ni -> mi .rno , svcn ,
1836
1849
evcn1 - 1 , svcn , Add2Ptr (attr , roff ),
1837
1850
le32_to_cpu (attr -> size ) - roff );
0 commit comments