aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG5
-rw-r--r--fuzz/fuzz_targets/decode_does_not_panic.rs9
-rw-r--r--fuzz/fuzz_targets/displaysink_used_correctly.rs4
-rw-r--r--src/long_mode/mod.rs1
-rw-r--r--src/protected_mode/mod.rs1
-rw-r--r--src/real_mode/mod.rs1
6 files changed, 18 insertions, 3 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 906ccdb..0765b68 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,8 @@
+## 2.1.1
+
+* fix jrcxz/jecxz/jcxz having "two operands". accessing the "second" operand
+ through `Instruction::operand` is a guaranteed panic.
+
## 2.1.0
### additions
diff --git a/fuzz/fuzz_targets/decode_does_not_panic.rs b/fuzz/fuzz_targets/decode_does_not_panic.rs
index fd6efec..7e0c812 100644
--- a/fuzz/fuzz_targets/decode_does_not_panic.rs
+++ b/fuzz/fuzz_targets/decode_does_not_panic.rs
@@ -3,10 +3,13 @@
extern crate yaxpeax_x86;
fuzz_target!(|data: &[u8]| {
+ if data.len() > 15 {
+ return;
+ }
let x86_64_decoder = yaxpeax_x86::long_mode::InstDecoder::default();
let x86_32_decoder = yaxpeax_x86::protected_mode::InstDecoder::default();
let x86_16_decoder = yaxpeax_x86::real_mode::InstDecoder::default();
- x86_64_decoder.decode_slice(data).expect("is ok");
- x86_32_decoder.decode_slice(data).expect("is ok");
- x86_16_decoder.decode_slice(data).expect("is ok");
+ let _res = x86_64_decoder.decode_slice(data);
+ let _res = x86_32_decoder.decode_slice(data);
+ let _res = x86_16_decoder.decode_slice(data);
});
diff --git a/fuzz/fuzz_targets/displaysink_used_correctly.rs b/fuzz/fuzz_targets/displaysink_used_correctly.rs
index bd8d1db..4815047 100644
--- a/fuzz/fuzz_targets/displaysink_used_correctly.rs
+++ b/fuzz/fuzz_targets/displaysink_used_correctly.rs
@@ -4,6 +4,10 @@ extern crate yaxpeax_x86;
extern crate yaxpeax_arch;
fuzz_target!(|data: &[u8]| {
+ if data.len() > 15 {
+ return;
+ }
+
let x86_64_decoder = yaxpeax_x86::long_mode::InstDecoder::default();
let x86_32_decoder = yaxpeax_x86::protected_mode::InstDecoder::default();
let x86_16_decoder = yaxpeax_x86::real_mode::InstDecoder::default();
diff --git a/src/long_mode/mod.rs b/src/long_mode/mod.rs
index bfe67c3..ca2e7cb 100644
--- a/src/long_mode/mod.rs
+++ b/src/long_mode/mod.rs
@@ -9144,6 +9144,7 @@ fn read_operands<
.with_id(words.offset() as u32 * 8),
);
instruction.operands[0] = OperandSpec::ImmI8;
+ instruction.operand_count = 1;
},
};
Ok(())
diff --git a/src/protected_mode/mod.rs b/src/protected_mode/mod.rs
index 3036620..6a1d19b 100644
--- a/src/protected_mode/mod.rs
+++ b/src/protected_mode/mod.rs
@@ -9053,6 +9053,7 @@ fn read_operands<
.with_id(words.offset() as u32 * 8),
);
instruction.operands[0] = OperandSpec::ImmI8;
+ instruction.operand_count = 1;
},
};
Ok(())
diff --git a/src/real_mode/mod.rs b/src/real_mode/mod.rs
index aa98846..f54533c 100644
--- a/src/real_mode/mod.rs
+++ b/src/real_mode/mod.rs
@@ -9112,6 +9112,7 @@ fn read_operands<
.with_id(words.offset() as u32 * 8),
);
instruction.operands[0] = OperandSpec::ImmI8;
+ instruction.operand_count = 1;
},
};
Ok(())