Skip to content

Commit f9bd8eb

Browse files
committed
Fix BinaryReader and BinaryWriter not respecting image base in Rust API
1 parent 3fd8d81 commit f9bd8eb

File tree

4 files changed

+16
-12
lines changed

4 files changed

+16
-12
lines changed

rust/src/binary_reader.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ impl Seek for BinaryReader {
105105
SeekFrom::Current(offset) => self.seek_to_relative_offset(offset),
106106
SeekFrom::Start(offset) => self.seek_to_offset(offset),
107107
SeekFrom::End(end_offset) => {
108+
// We do NOT need to add the image base here as
109+
// the reader (unlike the writer) can set the virtual base.
108110
let offset =
109111
self.view
110112
.len()

rust/src/binary_writer.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
use binaryninjacore_sys::*;
1818
use std::fmt::Debug;
1919

20-
use crate::binary_view::{BinaryView, BinaryViewBase};
20+
use crate::binary_view::{BinaryView, BinaryViewBase, BinaryViewExt};
2121
use crate::Endianness;
2222

2323
use crate::rc::Ref;
@@ -85,14 +85,13 @@ impl Seek for BinaryWriter {
8585
SeekFrom::Current(offset) => self.seek_to_relative_offset(offset),
8686
SeekFrom::Start(offset) => self.seek_to_offset(offset),
8787
SeekFrom::End(end_offset) => {
88-
let offset =
89-
self.view
90-
.len()
91-
.checked_add_signed(end_offset)
92-
.ok_or(std::io::Error::new(
93-
ErrorKind::Other,
94-
"Seeking from end overflowed",
95-
))?;
88+
let view_end = self.view.original_image_base() + self.view.len();
89+
let offset = view_end
90+
.checked_add_signed(end_offset)
91+
.ok_or(std::io::Error::new(
92+
ErrorKind::Other,
93+
"Seeking from end overflowed",
94+
))?;
9695
self.seek_to_offset(offset);
9796
}
9897
};

rust/tests/binary_reader.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use binaryninja::binary_reader::BinaryReader;
2-
use binaryninja::binary_view::BinaryViewBase;
2+
use binaryninja::binary_view::{BinaryViewBase, BinaryViewExt};
33
use binaryninja::headless::Session;
44
use rstest::*;
55
use std::io::{Read, Seek, SeekFrom};
@@ -55,6 +55,9 @@ fn test_binary_reader_read(_session: &Session) {
5555
let view = binaryninja::load(out_dir.join("atox.obj")).expect("Failed to create view");
5656
let mut reader = BinaryReader::new(&view);
5757

58+
// We want to do seeks with the image base.
59+
reader.set_virtual_base(view.original_image_base());
60+
5861
reader
5962
.seek(SeekFrom::Start(0))
6063
.expect("Failed to seek to start");

rust/tests/binary_writer.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use binaryninja::binary_reader::BinaryReader;
2-
use binaryninja::binary_view::BinaryViewBase;
2+
use binaryninja::binary_view::{BinaryViewBase, BinaryViewExt};
33
use binaryninja::binary_writer::BinaryWriter;
44
use binaryninja::headless::Session;
55
use rstest::*;
@@ -17,7 +17,7 @@ fn test_binary_writer_seek(_session: &Session) {
1717
let out_dir = env!("OUT_DIR").parse::<PathBuf>().unwrap();
1818
let view = binaryninja::load(out_dir.join("atox.obj")).expect("Failed to create view");
1919
let mut writer = BinaryWriter::new(&view);
20-
let end_offset = view.len();
20+
let end_offset = view.original_image_base() + view.len();
2121

2222
// Test seeking to a specific position
2323
writer

0 commit comments

Comments
 (0)