From 5feefbe6e7b6cdd809eba4074d41dc95a7035f7e Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Thu, 2 Apr 2020 18:17:55 -0700 Subject: [PATCH] Improve asmap Interpret checks and document failures --- src/util/asmap.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/util/asmap.cpp b/src/util/asmap.cpp index 5b21d01f3..e428ec813 100644 --- a/src/util/asmap.cpp +++ b/src/util/asmap.cpp @@ -91,9 +91,9 @@ uint32_t Interpret(const std::vector &asmap, const std::vector &ip) } else if (opcode == Instruction::JUMP) { jump = DecodeJump(pos, endpos); 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 (jump >= endpos - pos) break; pos += jump; } bits--; @@ -101,8 +101,8 @@ uint32_t Interpret(const std::vector &asmap, const std::vector &ip) match = DecodeMatch(pos, endpos); if (match == INVALID) break; // Match bits straddle EOF matchlen = CountBits(match) - 1; + if (bits < matchlen) break; // Not enough input bits for (uint32_t bit = 0; bit < matchlen; bit++) { - if (bits == 0) break; if ((ip[ip.size() - bits]) != ((match >> (matchlen - 1 - bit)) & 1)) { return default_asn; } @@ -115,5 +115,6 @@ uint32_t Interpret(const std::vector &asmap, const std::vector &ip) break; // Instruction straddles EOF } } + // Reached EOF without RETURN, or aborted (see any of the breaks above). return 0; // 0 is not a valid ASN }