Improve asmap Interpret checks and document failures

This commit is contained in:
Pieter Wuille 2020-04-02 18:17:55 -07:00
parent 2b3dbfa5a6
commit 5feefbe6e7

View file

@ -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
} }