Skip to content

Commit 13178c4

Browse files
Liedtkev8-internal-scoped@luci-project-accounts.iam.gserviceaccount.com
authored andcommitted
[js] OperationMutator: Fix crash caused by wrong destruct inout count
Fixed: 542466166 Change-Id: I51c3c73075834d4db211ad5304ba3a04e6af36dc Reviewed-on: https://chrome-internal-review.googlesource.com/c/v8/fuzzilli/+/9631416 Commit-Queue: Matthias Liedtke <mliedtke@google.com> Reviewed-by: Michael Achenbach <machenbach@google.com>
1 parent 3483e45 commit 13178c4

2 files changed

Lines changed: 43 additions & 1 deletion

File tree

Sources/Fuzzilli/Mutators/OperationMutator.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,11 @@ public class OperationMutator: BaseInstructionMutator {
635635
if let newPattern = mutateDestructuringPattern(
636636
op.pattern, b, &inouts, isReassign: false)
637637
{
638-
newOp = Destruct(pattern: newPattern, numInputs: 1, numOutputs: inouts.count - 1)
638+
newOp = Destruct(
639+
pattern: newPattern,
640+
numInputs: 1 + newPattern.numExtraInputs,
641+
numOutputs: newPattern.numBindings
642+
)
639643
} else {
640644
return instr
641645
}

Tests/FuzzilliTests/MutatorTests.swift

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -859,4 +859,42 @@ struct MutatorTests {
859859
mutatedProg.checkOrDie(onFailure: "Program must be statically valid")
860860
}
861861
}
862+
863+
@Test func testOperationMutatorDestructPatternCrash() throws {
864+
let fuzzer = makeMockFuzzer()
865+
try fuzzer.sync {
866+
let pattern = DestructuringPattern.array(
867+
.init(
868+
elements: [
869+
.init(target: .flatBinding, hasDefaultValue: true)
870+
],
871+
restTarget: nil
872+
)
873+
)
874+
875+
let b = fuzzer.makeBuilder()
876+
let source = b.loadInt(1)
877+
let defaultValue = b.loadInt(2)
878+
b.destruct(source, using: pattern, defaultValues: [defaultValue])
879+
let prog = b.finalize()
880+
881+
let mutator = OperationMutator()
882+
883+
let newBuilder = fuzzer.makeBuilder()
884+
newBuilder.adopting {
885+
for instr in prog.code {
886+
if instr.op is Destruct {
887+
mutator.mutate(instr, newBuilder)
888+
} else {
889+
newBuilder.adopt(instr)
890+
}
891+
}
892+
}
893+
894+
let mutatedProg = newBuilder.finalize()
895+
// The program should be valid and lifting should not crash.
896+
try mutatedProg.code.check()
897+
_ = FuzzILLifter().lift(mutatedProg)
898+
}
899+
}
862900
}

0 commit comments

Comments
 (0)