summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunwox <me@unwox.com>2024-06-13 13:09:24 +0600
committerunwox <me@unwox.com>2024-06-13 13:09:24 +0600
commitecec880f946c3ff4cbad79223f6941e16e8f19c0 (patch)
tree8ce9b7f562de379f9e5c0135e515cbf47cfc1e33
parentd00ee9196d08cf824c9ec55f2987399c751df966 (diff)
add RestoreStackFunc method for preventing stack leaks
-rw-r--r--lua.go18
-rw-r--r--worker.go5
2 files changed, 21 insertions, 2 deletions
diff --git a/lua.go b/lua.go
index 874dac8..9e7b6ec 100644
--- a/lua.go
+++ b/lua.go
@@ -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))
+ }
+}
diff --git a/worker.go b/worker.go
index 3c64d68..6d659da 100644
--- a/worker.go
+++ b/worker.go
@@ -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),