mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-05-19 16:30:50 +02:00
Improve asmap Interpret checks and document failures
This commit is contained in:
parent
2b3dbfa5a6
commit
5feefbe6e7
@ -91,9 +91,9 @@ uint32_t Interpret(const std::vector<bool> &asmap, const std::vector<bool> &ip)
|
|||||||
} else if (opcode == Instruction::JUMP) {
|
} else if (opcode == Instruction::JUMP) {
|
||||||
jump = DecodeJump(pos, endpos);
|
jump = DecodeJump(pos, endpos);
|
||||||
if (jump == INVALID) break; // Jump offset straddles EOF
|
if (jump == INVALID) break; // Jump offset straddles EOF
|
||||||
if (bits == 0) break;
|
if (bits == 0) break; // No input bits left
|
||||||
|
if (jump >= endpos - pos) break; // Jumping past EOF
|
||||||
if (ip[ip.size() - bits]) {
|
if (ip[ip.size() - bits]) {
|
||||||
if (jump >= endpos - pos) break;
|
|
||||||
pos += jump;
|
pos += jump;
|
||||||
}
|
}
|
||||||
bits--;
|
bits--;
|
||||||
@ -101,8 +101,8 @@ uint32_t Interpret(const std::vector<bool> &asmap, const std::vector<bool> &ip)
|
|||||||
match = DecodeMatch(pos, endpos);
|
match = DecodeMatch(pos, endpos);
|
||||||
if (match == INVALID) break; // Match bits straddle EOF
|
if (match == INVALID) break; // Match bits straddle EOF
|
||||||
matchlen = CountBits(match) - 1;
|
matchlen = CountBits(match) - 1;
|
||||||
|
if (bits < matchlen) break; // Not enough input bits
|
||||||
for (uint32_t bit = 0; bit < matchlen; bit++) {
|
for (uint32_t bit = 0; bit < matchlen; bit++) {
|
||||||
if (bits == 0) break;
|
|
||||||
if ((ip[ip.size() - bits]) != ((match >> (matchlen - 1 - bit)) & 1)) {
|
if ((ip[ip.size() - bits]) != ((match >> (matchlen - 1 - bit)) & 1)) {
|
||||||
return default_asn;
|
return default_asn;
|
||||||
}
|
}
|
||||||
@ -115,5 +115,6 @@ uint32_t Interpret(const std::vector<bool> &asmap, const std::vector<bool> &ip)
|
|||||||
break; // Instruction straddles EOF
|
break; // Instruction straddles EOF
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Reached EOF without RETURN, or aborted (see any of the breaks above).
|
||||||
return 0; // 0 is not a valid ASN
|
return 0; // 0 is not a valid ASN
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user