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) {
|
if let Some(val) = pstate.reg_aliases.get(reference) {
|
||||||
Ok(DataDisp::ObjectPtr(*val))
|
Ok(DataDisp::ObjectPtr(*val))
|
||||||
} else {
|
} 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()) {
|
} else if s.starts_with(|c: char| c.is_ascii_digit()) {
|
||||||
Ok(DataDisp::Immediate(unsafe { std::mem::transmute(parse_i64(s)?) }))
|
Ok(DataDisp::Immediate(unsafe { std::mem::transmute(parse_i64(s)?) }))
|
||||||
} else {
|
} 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::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::asm::parse::sexp_expect::expect_string_atom;
|
||||||
use crate::builtin::defs::{Barrier, BuiltinOp};
|
use crate::builtin::defs::{Barrier, BuiltinOp};
|
||||||
use crate::module::{CrsnExtension, ParseRes};
|
use crate::module::{ParseRes};
|
||||||
use crate::utils::A;
|
use crate::utils::A;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -168,8 +168,8 @@ impl OpTrait for ScreenOp {
|
|||||||
let xval = xf.round() as u64;
|
let xval = xf.round() as u64;
|
||||||
let yval = yf.round() as u64;
|
let yval = yf.round() as u64;
|
||||||
|
|
||||||
state.write(*x, xval);
|
state.write(*x, xval)?;
|
||||||
state.write(*y, yval);
|
state.write(*y, yval)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use crsn::asm::data::{Rd, RdData};
|
use crsn::asm::data::{Rd};
|
||||||
use crsn::asm::error::CrsnError;
|
use crsn::asm::error::CrsnError;
|
||||||
use crsn::asm::instr::op::OpKind;
|
use crsn::asm::instr::op::OpKind;
|
||||||
use crsn::asm::parse::arg_parser::TokenParser;
|
use crsn::asm::parse::arg_parser::TokenParser;
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ pub(crate) fn drop_obj(state: &mut RunState, handle: Value) -> Result<Option<()>
|
|||||||
Ok(stacks.store.remove(&handle).map(|_| ()))
|
Ok(stacks.store.remove(&handle).map(|_| ()))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prepare_push(mut state: &mut RunState, obj: &RdObj, src: &Rd, pushfn : impl FnOnce(&mut VecDeque<Value>, Value) -> ()) -> Result<(), Fault> {
|
fn prepare_push(state: &mut RunState, obj: &RdObj, src: &Rd, pushfn : impl FnOnce(&mut VecDeque<Value>, Value) -> ()) -> Result<(), Fault> {
|
||||||
state.clear_status();
|
state.clear_status();
|
||||||
let handle = state.read_obj(*obj)?;
|
let handle = state.read_obj(*obj)?;
|
||||||
let val = state.read(*src)?;
|
let val = state.read(*src)?;
|
||||||
|
|||||||
Reference in New Issue
Block a user