summaryrefslogtreecommitdiff
path: root/rust/src
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2025-02-06 23:58:33 -0500
committerMason Reed <mason@vector35.com>2025-02-06 23:58:33 -0500
commitf9bd8eb2a8aa8b492d4145624d12e7014c7ee65c (patch)
tree2d9fa45c718eab1bb373a290eddfa7e38d806faa /rust/src
parent3fd8d8123d52330dc1fae22371c4b4298f709eba (diff)
Fix BinaryReader and BinaryWriter not respecting image base in Rust API
Diffstat (limited to 'rust/src')
-rw-r--r--rust/src/binary_reader.rs2
-rw-r--r--rust/src/binary_writer.rs17
2 files changed, 10 insertions, 9 deletions
diff --git a/rust/src/binary_reader.rs b/rust/src/binary_reader.rs
index da29b515..1ee4e73e 100644
--- a/rust/src/binary_reader.rs
+++ b/rust/src/binary_reader.rs
@@ -105,6 +105,8 @@ impl Seek for BinaryReader {
SeekFrom::Current(offset) => self.seek_to_relative_offset(offset),
SeekFrom::Start(offset) => self.seek_to_offset(offset),
SeekFrom::End(end_offset) => {
+ // We do NOT need to add the image base here as
+ // the reader (unlike the writer) can set the virtual base.
let offset =
self.view
.len()
diff --git a/rust/src/binary_writer.rs b/rust/src/binary_writer.rs
index ce713435..e4387d70 100644
--- a/rust/src/binary_writer.rs
+++ b/rust/src/binary_writer.rs
@@ -17,7 +17,7 @@
use binaryninjacore_sys::*;
use std::fmt::Debug;
-use crate::binary_view::{BinaryView, BinaryViewBase};
+use crate::binary_view::{BinaryView, BinaryViewBase, BinaryViewExt};
use crate::Endianness;
use crate::rc::Ref;
@@ -85,14 +85,13 @@ impl Seek for BinaryWriter {
SeekFrom::Current(offset) => self.seek_to_relative_offset(offset),
SeekFrom::Start(offset) => self.seek_to_offset(offset),
SeekFrom::End(end_offset) => {
- let offset =
- self.view
- .len()
- .checked_add_signed(end_offset)
- .ok_or(std::io::Error::new(
- ErrorKind::Other,
- "Seeking from end overflowed",
- ))?;
+ let view_end = self.view.original_image_base() + self.view.len();
+ let offset = view_end
+ .checked_add_signed(end_offset)
+ .ok_or(std::io::Error::new(
+ ErrorKind::Other,
+ "Seeking from end overflowed",
+ ))?;
self.seek_to_offset(offset);
}
};