From c073d85d746afda3cf045d6e20fb52b6cd2b21dd Mon Sep 17 00:00:00 2001 From: Ilya Rezvov Date: Sat, 21 Apr 2018 10:46:29 -0700 Subject: [PATCH] calculate offset without uint32 overflow --- src/Language/Wasm/Interpreter.hs | 28 ++++++++++++++-------------- tests/Test.hs | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Language/Wasm/Interpreter.hs b/src/Language/Wasm/Interpreter.hs index db4fc17..9b91d2b 100644 --- a/src/Language/Wasm/Interpreter.hs +++ b/src/Language/Wasm/Interpreter.hs @@ -731,7 +731,7 @@ eval store FunctionInstance { funcType, moduleInstance, code = Function { localT step ctx@EvalCtx{ stack = (VI32 v:rest) } (I32Load MemArg { offset }) = do let MemoryInstance { memory = memoryRef } = memInstances store ! (memaddrs moduleInstance ! 0) memory <- readIORef memoryRef - let addr = fromIntegral $ v + fromIntegral offset + let addr = fromIntegral v + fromIntegral offset let readByte idx = do byte <- IOVector.read memory $ addr + idx return $ fromIntegral byte `shiftL` (idx * 8) @@ -743,7 +743,7 @@ eval store FunctionInstance { funcType, moduleInstance, code = Function { localT step ctx@EvalCtx{ stack = (VI32 v:rest) } (I64Load MemArg { offset }) = do let MemoryInstance { memory = memoryRef } = memInstances store ! (memaddrs moduleInstance ! 0) memory <- readIORef memoryRef - let addr = fromIntegral $ v + fromIntegral offset + let addr = fromIntegral v + fromIntegral offset let readByte idx = do byte <- IOVector.read memory $ addr + idx return $ fromIntegral byte `shiftL` (idx * 8) @@ -755,7 +755,7 @@ eval store FunctionInstance { funcType, moduleInstance, code = Function { localT step ctx@EvalCtx{ stack = (VI32 v:rest) } (F32Load MemArg { offset }) = do let MemoryInstance { memory = memoryRef } = memInstances store ! (memaddrs moduleInstance ! 0) memory <- readIORef memoryRef - let addr = fromIntegral $ v + fromIntegral offset + let addr = fromIntegral v + fromIntegral offset let readByte idx = do byte <- IOVector.read memory $ addr + idx return $ fromIntegral byte `shiftL` (idx * 8) @@ -767,7 +767,7 @@ eval store FunctionInstance { funcType, moduleInstance, code = Function { localT step ctx@EvalCtx{ stack = (VI32 v:rest) } (F64Load MemArg { offset }) = do let MemoryInstance { memory = memoryRef } = memInstances store ! (memaddrs moduleInstance ! 0) memory <- readIORef memoryRef - let addr = fromIntegral $ v + fromIntegral offset + let addr = fromIntegral v + fromIntegral offset let readByte idx = do byte <- IOVector.read memory $ addr + idx return $ fromIntegral byte `shiftL` (idx * 8) @@ -779,7 +779,7 @@ eval store FunctionInstance { funcType, moduleInstance, code = Function { localT step ctx@EvalCtx{ stack = (VI32 v:rest) } (I32Load8U MemArg { offset }) = do let MemoryInstance { memory = memoryRef } = memInstances store ! (memaddrs moduleInstance ! 0) memory <- readIORef memoryRef - let addr = fromIntegral $ v + fromIntegral offset + let addr = fromIntegral v + fromIntegral offset if addr + 1 > IOVector.length memory then return Trap else do @@ -788,7 +788,7 @@ eval store FunctionInstance { funcType, moduleInstance, code = Function { localT step ctx@EvalCtx{ stack = (VI32 v:rest) } (I32Load8S MemArg { offset }) = do let MemoryInstance { memory = memoryRef } = memInstances store ! (memaddrs moduleInstance ! 0) memory <- readIORef memoryRef - let addr = fromIntegral $ v + fromIntegral offset + let addr = fromIntegral v + fromIntegral offset if addr + 4 > IOVector.length memory then return Trap else do @@ -798,7 +798,7 @@ eval store FunctionInstance { funcType, moduleInstance, code = Function { localT step ctx@EvalCtx{ stack = (VI32 v:rest) } (I32Load16U MemArg { offset }) = do let MemoryInstance { memory = memoryRef } = memInstances store ! (memaddrs moduleInstance ! 0) memory <- readIORef memoryRef - let addr = fromIntegral $ v + fromIntegral offset + let addr = fromIntegral v + fromIntegral offset let readByte idx = do byte <- IOVector.read memory $ addr + idx return $ fromIntegral byte `shiftL` (idx * 8) @@ -810,7 +810,7 @@ eval store FunctionInstance { funcType, moduleInstance, code = Function { localT step ctx@EvalCtx{ stack = (VI32 v:rest) } (I32Load16S MemArg { offset }) = do let MemoryInstance { memory = memoryRef } = memInstances store ! (memaddrs moduleInstance ! 0) memory <- readIORef memoryRef - let addr = fromIntegral $ v + fromIntegral offset + let addr = fromIntegral v + fromIntegral offset let readByte idx = do byte <- IOVector.read memory $ addr + idx return $ (fromIntegral byte :: Word32) `shiftL` (idx * 8) @@ -823,7 +823,7 @@ eval store FunctionInstance { funcType, moduleInstance, code = Function { localT step ctx@EvalCtx{ stack = (VI32 v:rest) } (I64Load8U MemArg { offset }) = do let MemoryInstance { memory = memoryRef } = memInstances store ! (memaddrs moduleInstance ! 0) memory <- readIORef memoryRef - let addr = fromIntegral $ v + fromIntegral offset + let addr = fromIntegral v + fromIntegral offset if addr + 1 > IOVector.length memory then return Trap else do @@ -832,7 +832,7 @@ eval store FunctionInstance { funcType, moduleInstance, code = Function { localT step ctx@EvalCtx{ stack = (VI32 v:rest) } (I64Load8S MemArg { offset }) = do let MemoryInstance { memory = memoryRef } = memInstances store ! (memaddrs moduleInstance ! 0) memory <- readIORef memoryRef - let addr = fromIntegral $ v + fromIntegral offset + let addr = fromIntegral v + fromIntegral offset if addr + 1 > IOVector.length memory then return Trap else do @@ -842,7 +842,7 @@ eval store FunctionInstance { funcType, moduleInstance, code = Function { localT step ctx@EvalCtx{ stack = (VI32 v:rest) } (I64Load16U MemArg { offset }) = do let MemoryInstance { memory = memoryRef } = memInstances store ! (memaddrs moduleInstance ! 0) memory <- readIORef memoryRef - let addr = fromIntegral $ v + fromIntegral offset + let addr = fromIntegral v + fromIntegral offset let readByte idx = do byte <- IOVector.read memory $ addr + idx return $ fromIntegral byte `shiftL` (idx * 8) @@ -854,7 +854,7 @@ eval store FunctionInstance { funcType, moduleInstance, code = Function { localT step ctx@EvalCtx{ stack = (VI32 v:rest) } (I64Load16S MemArg { offset }) = do let MemoryInstance { memory = memoryRef } = memInstances store ! (memaddrs moduleInstance ! 0) memory <- readIORef memoryRef - let addr = fromIntegral $ v + fromIntegral offset + let addr = fromIntegral v + fromIntegral offset let readByte idx = do byte <- IOVector.read memory $ addr + idx return $ (fromIntegral byte :: Word32) `shiftL` (idx * 8) @@ -867,7 +867,7 @@ eval store FunctionInstance { funcType, moduleInstance, code = Function { localT step ctx@EvalCtx{ stack = (VI32 v:rest) } (I64Load32U MemArg { offset }) = do let MemoryInstance { memory = memoryRef } = memInstances store ! (memaddrs moduleInstance ! 0) memory <- readIORef memoryRef - let addr = fromIntegral $ v + fromIntegral offset + let addr = fromIntegral v + fromIntegral offset let readByte idx = do byte <- IOVector.read memory $ addr + idx return $ fromIntegral byte `shiftL` (idx * 8) @@ -879,7 +879,7 @@ eval store FunctionInstance { funcType, moduleInstance, code = Function { localT step ctx@EvalCtx{ stack = (VI32 v:rest) } (I64Load32S MemArg { offset }) = do let MemoryInstance { memory = memoryRef } = memInstances store ! (memaddrs moduleInstance ! 0) memory <- readIORef memoryRef - let addr = fromIntegral $ v + fromIntegral offset + let addr = fromIntegral v + fromIntegral offset let readByte idx = do byte <- IOVector.read memory $ addr + idx return $ (fromIntegral byte :: Word32) `shiftL` (idx * 8) diff --git a/tests/Test.hs b/tests/Test.hs index 3530abf..0cc4c0d 100644 --- a/tests/Test.hs +++ b/tests/Test.hs @@ -34,7 +34,7 @@ compile file = do main :: IO () main = do files <- Directory.listDirectory "tests/samples" - -- let files = ["traps.wast"] + -- let files = ["address.wast"] scriptTestCases <- (`mapM` files) $ \file -> do content <- LBS.readFile $ "tests/samples/" ++ file let Right script = Lexer.scanner content >>= Parser.parseScript