.. | .. |
---|
192 | 192 | case Z_EROFS_VLE_CLUSTER_TYPE_PLAIN: |
---|
193 | 193 | case Z_EROFS_VLE_CLUSTER_TYPE_HEAD: |
---|
194 | 194 | m->clusterofs = le16_to_cpu(di->di_clusterofs); |
---|
| 195 | + if (m->clusterofs >= 1 << vi->z_logical_clusterbits) { |
---|
| 196 | + DBG_BUGON(1); |
---|
| 197 | + return -EFSCORRUPTED; |
---|
| 198 | + } |
---|
195 | 199 | m->pblk = le32_to_cpu(di->di_u.blkaddr); |
---|
196 | 200 | break; |
---|
197 | 201 | default: |
---|
.. | .. |
---|
225 | 229 | u8 *in, type; |
---|
226 | 230 | bool big_pcluster; |
---|
227 | 231 | |
---|
228 | | - if (1 << amortizedshift == 4) |
---|
| 232 | + if (1 << amortizedshift == 4 && lclusterbits <= 14) |
---|
229 | 233 | vcnt = 2; |
---|
230 | 234 | else if (1 << amortizedshift == 2 && lclusterbits == 12) |
---|
231 | 235 | vcnt = 16; |
---|
.. | .. |
---|
318 | 322 | { |
---|
319 | 323 | struct inode *const inode = m->inode; |
---|
320 | 324 | struct erofs_inode *const vi = EROFS_I(inode); |
---|
321 | | - const unsigned int lclusterbits = vi->z_logical_clusterbits; |
---|
322 | 325 | const erofs_off_t ebase = ALIGN(iloc(EROFS_I_SB(inode), vi->nid) + |
---|
323 | 326 | vi->inode_isize + vi->xattr_isize, 8) + |
---|
324 | 327 | sizeof(struct z_erofs_map_header); |
---|
.. | .. |
---|
327 | 330 | unsigned int amortizedshift; |
---|
328 | 331 | erofs_off_t pos; |
---|
329 | 332 | int err; |
---|
330 | | - |
---|
331 | | - if (lclusterbits != 12) |
---|
332 | | - return -EOPNOTSUPP; |
---|
333 | 333 | |
---|
334 | 334 | if (lcn >= totalidx) |
---|
335 | 335 | return -EINVAL; |
---|