From be810aca0a3fba7b379bde2e61c2e4d39ae865b4 Mon Sep 17 00:00:00 2001 From: tevador Date: Fri, 11 Oct 2019 11:31:05 +0200 Subject: [PATCH] Fix a possible out-of-bounds access in superscalar generator --- src/superscalar.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/superscalar.cpp b/src/superscalar.cpp index b3c52c0..4e9fd78 100644 --- a/src/superscalar.cpp +++ b/src/superscalar.cpp @@ -637,7 +637,7 @@ namespace randomx { int cycle1 = scheduleUop(mop.getUop1(), portBusy, cycle); int cycle2 = scheduleUop(mop.getUop2(), portBusy, cycle); - if (cycle1 == cycle2) { + if (cycle1 >= 0 && cycle1 == cycle2) { if (commit) { scheduleUop(mop.getUop1(), portBusy, cycle1); scheduleUop(mop.getUop2(), portBusy, cycle2); @@ -761,6 +761,12 @@ namespace randomx { //recalculate when the instruction can be scheduled for execution based on operand availability scheduleCycle = scheduleMop(mop, portBusy, scheduleCycle, scheduleCycle); + if (scheduleCycle < 0) { + if (trace) std::cout << "Unable to map operation '" << mop.getName() << "' to execution port (cycle " << scheduleCycle << ")" << std::endl; + portsSaturated = true; + break; + } + //calculate when the result will be ready depCycle = scheduleCycle + mop.getLatency();