out of bounds memory access with regexp.Compile
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
Looks like a stack overflow to me. Have you tried increasing the stack size using -stack-size=32k for example?
Looks like a stack overflow to me. Have you tried increasing the stack size using
-stack-size=32kfor example?
I did not but increasing the stack size does not solve it, also not a value higher than 32k.
This is a known stack overflow issue. If possible, switch to a code-generation based regexps package like libfsm or ragel.
@dgryski Is there any plan to fix this issue?