Skip to content

Commit

Permalink
removing fixed size for output vector
Browse files Browse the repository at this point in the history
  • Loading branch information
snf committed Sep 6, 2015
1 parent d4cc575 commit 2d6ad5d
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 19 deletions.
22 changes: 13 additions & 9 deletions src/assembler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ mod extern_def {
#[link(name = "assemble")]
extern "C" {
pub fn assemble(arch: Enum_Arch, instructions: *const ::libc::c_char,
out: *mut byte, out_len: *mut size_t) -> ::libc::c_int;
out: *mut *mut byte, out_len: *mut size_t) -> ::libc::c_int;
pub fn free_vec(vec: *mut byte);
}
}

Expand Down Expand Up @@ -50,25 +51,28 @@ impl Arch {
pub fn assemble(arch: Arch, input: &str) -> Option<Vec<u8>> {
use std::ffi::CString;
use std::slice;
use std::mem;
use libc;

let e_arch = arch.to_c();
let ins = CString::new(input).unwrap();

unsafe {
let mut out_len = 0x100;
let out_arr: *mut u8 = libc::malloc(out_len) as (*mut u8);
let mut out_len = 0;
let out_arr: *mut *mut u8 =
libc::malloc(mem::size_of::<usize>() as libc::size_t)
as *mut *mut u8;

let res = extern_def::assemble(e_arch, ins.as_ptr(), out_arr, &mut out_len);
if res == 0 {
Some(slice::from_raw_parts(out_arr, out_len as usize).to_vec())
let vec = Some(
slice::from_raw_parts(*out_arr, out_len as usize).to_vec());

extern_def::free_vec(*out_arr);
libc::free(out_arr as *mut libc::c_void);
vec
} else {
None
}
}
}

#[test]
fn test_assemble() {
assert_eq!(assemble(Arch::X86, "int3").unwrap(), [0xcc]);
}
19 changes: 11 additions & 8 deletions src/c/assemble.cc
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,11 @@ static int assemble_llvm(StringRef &arch, StringRef &input_str, std::vector<byte
return Res;
}

int assemble(enum Arch arch, const char *instructions, byte *out, size_t *out_len) {
void free_vec(byte *vec) {
free(vec);
}

int assemble(enum Arch arch, const char *instructions, byte **out, size_t *out_len) {
StringRef s_arch;
std::vector<byte> out_vec;

Expand Down Expand Up @@ -351,13 +355,12 @@ int assemble(enum Arch arch, const char *instructions, byte *out, size_t *out_le
return -1;
}

if (*out_len >= out_vec.size()) {
memcpy(out, out_vec.data(), out_vec.size());
*out_len = out_vec.size();
return 0;
} else {
return -1;
}
*out = (byte *)malloc(out_vec.size());
*out_len = out_vec.size();

memcpy(*out, out_vec.data(), out_vec.size());

return 0;
}

/*
Expand Down
3 changes: 2 additions & 1 deletion src/c/assemble.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ extern "C" {
ppc32,
};

int assemble(enum Arch arch, const char *instructions, byte *out, size_t *out_len);
void free_vec(byte *vec);
int assemble(enum Arch arch, const char *instructions, byte **out, size_t *out_len);

#ifdef __cplusplus
}
Expand Down
3 changes: 2 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ pub mod assembler;
pub use assembler::{Arch, assemble};

#[test]
fn it_works() {
fn x86_int3() {
assert_eq!(assemble(Arch::X86, "int3").unwrap(), [0xcc]);
}

0 comments on commit 2d6ad5d

Please sign in to comment.