Fix bug in ACL block-RO checker

The code as-is would bug out like below:
```
(input) --blk 255 -d ...f0f0f0...
[=] Sector trailer (ST) write detected
[!] ⚠️  Strict ReadOnly Access Conditions on block 240 detected
[!] ⚠️  Strict ReadOnly Access Conditions on block 241 detected
[!] ⚠️  Strict ReadOnly Access Conditions on block 242 detected
```
This is incorrect. in 16-block sectors, ACLs cover chunks of 5 blocks at once.
It should (and now does) look like:
```
[=] Sector trailer (ST) write detected
[!] ⚠️  Strict ReadOnly Access Conditions on blocks 240-244 detected
[!] ⚠️  Strict ReadOnly Access Conditions on blocks 245-249 detected
[!] ⚠️  Strict ReadOnly Access Conditions on blocks 250-254 detected
```

Signed-off-by: team-orangeBlue <63470411+team-orangeBlue@users.noreply.github.com>
This commit is contained in:
team-orangeBlue
2026-04-11 00:38:14 +03:00
committed by GitHub
parent 2b5ac4ca44
commit 1cb843a22b
+8 -2
View File
@@ -1195,10 +1195,16 @@ static int mfp_analyse_st_block(uint8_t blockno, uint8_t *block, bool force) {
}
bool ro_detected = false;
uint8_t bar = mfNumBlocksPerSector(mfSectorNum(blockno));
//uint8_t bar = mfNumBlocksPerSector(mfSectorNum(blockno));
uint8_t bar = 4;
for (uint8_t foo = 0; foo < bar; foo++) {
if (mfReadOnlyAccessConditions(foo, &block[6])) {
PrintAndLogEx(WARNING, "Strict ReadOnly Access Conditions on block " _YELLOW_("%u") " detected", blockno - bar + 1 + foo);
// WARNING: Sectors 33+ assume ACLs apply to groups of 4 blocks, not 1 block.
// The code as-is is bugged and actually wastes iterations. If you have 16 blocks, it'll run all 16 but only error out like it's a 4-block sector.
if (blockno<127)
PrintAndLogEx(WARNING, "Strict ReadOnly Access Conditions on block " _YELLOW_("%u") " detected", blockno - bar + 1 + foo);
else
PrintAndLogEx(WARNING, "Strict ReadOnly Access Conditions on blocks " _YELLOW_("%u-%u") " detected", blockno - bar*4 + 1 + foo*5, blockno - bar*4 + 1 + foo*5 + 4);
ro_detected = true;
}
}