Skip to content

Commit

Permalink
baseline: Fix incorrect exit after invalid jump
Browse files Browse the repository at this point in the history
To handle invalid jump the implementation targets the byte just after
the official code length. For padded code this byte may be uninitialized
push data causing unpredictable behavior. The fix is to also init this
byte to OP_STOP.
  • Loading branch information
chfast committed Aug 3, 2021
1 parent 2050135 commit a425284
Showing 1 changed file with 2 additions and 1 deletion.
3 changes: 2 additions & 1 deletion lib/evmone/baseline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ CodeAnalysis analyze(const uint8_t* code, size_t code_size)
// Using "raw" new operator instead of std::make_unique() to get uninitialized array.
std::unique_ptr<uint8_t[]> padded_code{new uint8_t[i + 1]}; // +1 for the final STOP.
std::copy_n(code, code_size, padded_code.get());
padded_code[i] = OP_STOP; // Set final STOP at the code end.
padded_code[code_size] = OP_STOP; // Used to terminate invalid jumps, see op_jump().
padded_code[i] = OP_STOP; // Set final STOP at the code end - guarantees loop termination.

// TODO: Using fixed-size padding of 33, the padded code buffer and jumpdest bitmap can be
// created with single allocation.
Expand Down

0 comments on commit a425284

Please sign in to comment.