forked from MightyPork/crsn
deny direct access to symmed register - prevents bugs
This commit is contained in:
@@ -95,12 +95,25 @@ pub fn parse_data_disp(tok: Option<Sexp>, pcx: &ParserContext) -> Result<DataDis
|
||||
if let Some(val) = pstate.reg_aliases.get(reference) {
|
||||
Ok(DataDisp::ObjectPtr(*val))
|
||||
} else {
|
||||
Ok(DataDisp::ObjectPtr(reg::parse_reg(reference)?))
|
||||
let reg = reg::parse_reg(reference)?;
|
||||
|
||||
if pstate.reg_aliases.values().find(|v| **v == reg).is_some() {
|
||||
Err(CrsnError::Parse(format!("Sym exists for register {}, direct access denied. Unsym it if needed.", reg).into()))
|
||||
} else {
|
||||
Ok(DataDisp::ObjectPtr(reg))
|
||||
}
|
||||
}
|
||||
} else if s.starts_with(|c: char| c.is_ascii_digit()) {
|
||||
Ok(DataDisp::Immediate(unsafe { std::mem::transmute(parse_i64(s)?) }))
|
||||
} else {
|
||||
Ok(DataDisp::Register(reg::parse_reg(s)?))
|
||||
let reg = reg::parse_reg(s)?;
|
||||
|
||||
let pstate = pcx.state.borrow();
|
||||
if pstate.reg_aliases.values().find(|v| **v == reg).is_some() {
|
||||
Err(CrsnError::Parse(format!("Sym exists for register {}, direct access denied. Unsym it if needed.", reg).into()))
|
||||
} else {
|
||||
Ok(DataDisp::Register(reg))
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
|
||||
@@ -8,7 +8,7 @@ use crate::asm::parse::arg_parser::TokenParser;
|
||||
use crate::asm::parse::parse_data::{parse_constant_name, parse_label, parse_rd, parse_reg_alias, parse_value, parse_label_str};
|
||||
use crate::asm::parse::sexp_expect::expect_string_atom;
|
||||
use crate::builtin::defs::{Barrier, BuiltinOp};
|
||||
use crate::module::{CrsnExtension, ParseRes};
|
||||
use crate::module::{ParseRes};
|
||||
use crate::utils::A;
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user