@@ -101,6 +101,10 @@ static int attr_load_runs(struct ATTRIB *attr, struct ntfs_inode *ni,
101101
102102 asize = le32_to_cpu (attr -> size );
103103 run_off = le16_to_cpu (attr -> nres .run_off );
104+
105+ if (run_off > asize )
106+ return - EINVAL ;
107+
104108 err = run_unpack_ex (run , ni -> mi .sbi , ni -> mi .rno , svcn , evcn ,
105109 vcn ? * vcn : svcn , Add2Ptr (attr , run_off ),
106110 asize - run_off );
@@ -1232,6 +1236,10 @@ int attr_load_runs_vcn(struct ntfs_inode *ni, enum ATTR_TYPE type,
12321236 }
12331237
12341238 ro = le16_to_cpu (attr -> nres .run_off );
1239+
1240+ if (ro > le32_to_cpu (attr -> size ))
1241+ return - EINVAL ;
1242+
12351243 err = run_unpack_ex (run , ni -> mi .sbi , ni -> mi .rno , svcn , evcn , svcn ,
12361244 Add2Ptr (attr , ro ), le32_to_cpu (attr -> size ) - ro );
12371245 if (err < 0 )
@@ -1901,6 +1909,11 @@ int attr_collapse_range(struct ntfs_inode *ni, u64 vbo, u64 bytes)
19011909 u16 le_sz ;
19021910 u16 roff = le16_to_cpu (attr -> nres .run_off );
19031911
1912+ if (roff > le32_to_cpu (attr -> size )) {
1913+ err = - EINVAL ;
1914+ goto out ;
1915+ }
1916+
19041917 run_unpack_ex (RUN_DEALLOCATE , sbi , ni -> mi .rno , svcn ,
19051918 evcn1 - 1 , svcn , Add2Ptr (attr , roff ),
19061919 le32_to_cpu (attr -> size ) - roff );
0 commit comments