From bd5d6d0686791eb44628afa83e9f600209a67104 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Tue, 8 Mar 2022 21:25:19 -0700 Subject: [PATCH] fix parser bounds check bug (#1333, #1301) --- src/machine/system_calls.rs | 4 +-- src/parser/parser.rs | 4 +-- src/types.rs | 53 ------------------------------------- 3 files changed, 4 insertions(+), 57 deletions(-) diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index c435503d..5e23e19e 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -3302,8 +3302,8 @@ impl Machine { .get_name(); let op = read_heap_cell!(self.machine_st.store(self.machine_st.deref(op)), - (HeapCellValueTag::Char) => { - self.machine_st.atom_tbl.build_with(&op.to_string()) + (HeapCellValueTag::Char, c) => { + self.machine_st.atom_tbl.build_with(&c.to_string()) } (HeapCellValueTag::Atom, (name, _arity)) => { name diff --git a/src/parser/parser.rs b/src/parser/parser.rs index 2d6334c0..45f98ab8 100644 --- a/src/parser/parser.rs +++ b/src/parser/parser.rs @@ -823,13 +823,13 @@ impl<'a, R: CharRead> Parser<'a, R> { self.reduce_op(1400); - if self.stack.len() == 1 { + if self.stack.len() <= 1 { return false; } let idx = self.stack.len() - 2; - let td = self.stack.remove(idx); + match td.tt { TokenType::Open | TokenType::OpenCT => { if self.stack[idx].tt == TokenType::Comma { diff --git a/src/types.rs b/src/types.rs index b151ee23..0c2f289d 100644 --- a/src/types.rs +++ b/src/types.rs @@ -5,9 +5,6 @@ use crate::machine::machine_indices::*; use crate::machine::partial_string::PartialString; use crate::machine::streams::*; use crate::parser::ast::Fixnum; -use crate::parser::rug::{Integer, Rational}; - -use ordered_float::OrderedFloat; use std::cmp::Ordering; use std::convert::TryFrom; @@ -244,56 +241,6 @@ pub struct HeapCellValue { tag: HeapCellValueTag, } -impl fmt::Display for HeapCellValue { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - read_heap_cell!(*self, - (HeapCellValueTag::Atom, (name, arity)) => { - if arity == 0 { - write!(f, "{}", name.as_str()) - } else { - write!( - f, - "{}/{}", - name.as_str(), - arity - ) - } - } - (HeapCellValueTag::PStr, pstr_atom) => { - let pstr = PartialString::from(pstr_atom); - - write!( - f, - "pstr ( \"{}\", )", - pstr.as_str_from(0) - ) - } - (HeapCellValueTag::Cons, c) => { - match_untyped_arena_ptr!(c, - (ArenaHeaderTag::Integer, n) => { - write!(f, "{}", n) - } - (ArenaHeaderTag::Rational, r) => { - write!(f, "{}", r) - } - (ArenaHeaderTag::F64, fl) => { - write!(f, "{}", fl) - } - (ArenaHeaderTag::Stream, stream) => { - write!(f, "$stream({})", stream.as_ptr() as usize) - } - _ => { - write!(f, "") - } - ) - } - _ => { - unreachable!() - } - ) - } -} - impl fmt::Debug for HeapCellValue { fn fmt(&self, f: &mut std::fmt::Formatter) -> fmt::Result { match self.get_tag() { -- 2.54.0