From be47aa7d43404753d294f8fdab38c26ab514459e Mon Sep 17 00:00:00 2001 From: Ilya Rezvov Date: Sun, 15 Apr 2018 19:08:27 -0700 Subject: [PATCH] fail on too long offset and align constants --- src/Language/Wasm/Parser.y | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/src/Language/Wasm/Parser.y b/src/Language/Wasm/Parser.y index c9bc03d..57f96c4 100644 --- a/src/Language/Wasm/Parser.y +++ b/src/Language/Wasm/Parser.y @@ -619,16 +619,40 @@ paramsresulttypeuse :: { FuncType } | 'result' list(valtype) ')' { FuncType [] $2 } memarg1 :: { MemArg } - : opt(offset) opt(align) { MemArg (fromMaybe 0 $1) (unpackAlign 1 $2) } + : opt(offset) opt(align) {% + let offset = fromMaybe 0 $1 in + let align = unpackAlign 1 $2 in + if offset >= 2 ^ 32 || align >= 2 ^ 32 + then Left "u32 is out of boundaries" + else return $ MemArg offset align + } memarg2 :: { MemArg } - : opt(offset) opt(align) { MemArg (fromMaybe 0 $1) (unpackAlign 2 $2) } + : opt(offset) opt(align) {% + let offset = fromMaybe 0 $1 in + let align = unpackAlign 2 $2 in + if offset >= 2 ^ 32 || align >= 2 ^ 32 + then Left "u32 is out of boundaries" + else return $ MemArg offset align + } memarg4 :: { MemArg } - : opt(offset) opt(align) { MemArg (fromMaybe 0 $1) (unpackAlign 4 $2) } + : opt(offset) opt(align) {% + let offset = fromMaybe 0 $1 in + let align = unpackAlign 4 $2 in + if offset >= 2 ^ 32 || align >= 2 ^ 32 + then Left "u32 is out of boundaries" + else return $ MemArg offset align + } memarg8 :: { MemArg } - : opt(offset) opt(align) { MemArg (fromMaybe 0 $1) (unpackAlign 8 $2) } + : opt(offset) opt(align) {% + let offset = fromMaybe 0 $1 in + let align = unpackAlign 8 $2 in + if offset >= 2 ^ 32 || align >= 2 ^ 32 + then Left "u32 is out of boundaries" + else return $ MemArg offset align + } instruction :: { [Instruction] } : raw_instr { $1 }