diff options
| author | unwox <me@unwox.com> | 2024-06-13 13:09:24 +0600 |
|---|---|---|
| committer | unwox <me@unwox.com> | 2024-06-13 13:09:24 +0600 |
| commit | ecec880f946c3ff4cbad79223f6941e16e8f19c0 (patch) | |
| tree | 8ce9b7f562de379f9e5c0135e515cbf47cfc1e33 | |
| parent | d00ee9196d08cf824c9ec55f2987399c751df966 (diff) | |
add RestoreStackFunc method for preventing stack leaks
| -rw-r--r-- | lua.go | 18 | ||||
| -rw-r--r-- | worker.go | 5 |
2 files changed, 21 insertions, 2 deletions
@@ -122,3 +122,21 @@ func (l *Lua) PushTableItem (key string) { C.lua_pushstring(l.l, ckey); C.lua_gettable(l.l, -2); } + +func (l *Lua) RestoreStackFunc() func () { + before := l.StackLen() + return func () { + after := l.StackLen() + diff := after - before + if diff == 0 { + return + } else if diff < 0 { + log.Fatalf( + "too many stack pops: len before: %d, after: %d\n", + before, + after, + ) + } + C.lua_settop(l.l, C.int(before)) + } +} @@ -57,6 +57,7 @@ func (w *Worker) Start (filename string) error { func (w *Worker) Listen () { for { r := <- w.read + resStack := w.lua.RestoreStackFunc() handlerRef := w.routes[r.Route] w.lua.PushFromRef(handlerRef) w.lua.PushString(r.Request.Method) @@ -70,7 +71,7 @@ func (w *Worker) Listen () { body, err := io.ReadAll(r.Request.Body) if err != nil { - w.lua.Pop(4); + resStack() r.result <- &WorkerResponse { Code: 500, Headers: make(map[string]string), @@ -101,7 +102,7 @@ func (w *Worker) Listen () { k := w.lua.ToString(-1) headers[k] = v } - w.lua.Pop(2) + resStack() r.result <- &WorkerResponse { Code: int(code), |
