tinygo icon indicating copy to clipboard operation
tinygo copied to clipboard

out of bounds memory access with regexp.Compile

Open raffis opened this issue 2 years ago • 4 comments

Reproduce

tinygo build -o mx.wasm -scheduler=none -target=wasi x.go
wasmtime run mx.wasm

x.go:

package main

import "regexp"

func main() {
	_, err := regexp.Compile(`[0-9A-Za-z-]{0,53}`)
	if err != nil {
		panic(err)
	}
}

Changing the same regex above to [0-9A-Za-z-]{0,52} works and no out of bounds occurs. Is this expected? I see that regexp/syntax tests fail in the supported packages.

Output

(export WASMTIME_BACKTRACE_DETAILS=1)

Error: failed to run main module `mx.wasm`

Caused by:
    0: failed to invoke command default
    1: error while executing at wasm backtrace:
           0: 0x1a00 - (*regexp/syntax.compiler).alt
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:201:20              - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:154:13
           1: 0x20f8 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:145:18
           2: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
           3: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
           4: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
           5: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
           6: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
           7: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
           8: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
           9: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          10: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          11: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          12: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          13: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          14: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          15: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          16: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          17: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          18: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          19: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          20: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          21: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          22: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          23: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          24: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          25: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          26: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          27: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          28: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          29: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          30: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          31: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          32: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          33: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          34: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          35: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          36: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          37: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          38: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          39: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          40: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          41: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          42: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          43: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          44: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          45: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          46: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          47: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          48: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          49: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          50: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          51: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          52: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          53: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          54: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          55: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          56: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          57: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          58: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          59: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          60: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          61: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          62: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          63: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          64: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          65: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          66: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          67: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          68: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          69: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          70: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          71: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          72: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          73: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          74: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          75: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          76: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          77: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          78: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          79: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          80: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          81: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          82: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          83: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          84: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          85: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          86: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          87: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          88: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          89: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          90: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          91: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          92: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          93: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          94: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          95: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          96: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          97: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
          98: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
          99: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
         100: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
         101: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
         102: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
         103: 0x2125 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:147:27
         104: 0x2021 - (*regexp/syntax.compiler).compile
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:137:27
         105: 0xbc37 - _start
                           at /home/raffi/.gvm/gos/go1.20/src/regexp/syntax/compile.go:74:16
    2: wasm trap: out of bounds memory access

raffis avatar May 25 '23 07:05 raffis

Looks like a stack overflow to me. Have you tried increasing the stack size using -stack-size=32k for example?

aykevl avatar May 25 '23 11:05 aykevl

Looks like a stack overflow to me. Have you tried increasing the stack size using -stack-size=32k for example?

I did not but increasing the stack size does not solve it, also not a value higher than 32k.

raffis avatar May 25 '23 12:05 raffis

This is a known stack overflow issue. If possible, switch to a code-generation based regexps package like libfsm or ragel.

dgryski avatar May 26 '23 00:05 dgryski

@dgryski Is there any plan to fix this issue?

johnlanni avatar Dec 07 '23 07:12 johnlanni