From 83cfc7dd534f129eab651f76c93203c59fe020f6 Mon Sep 17 00:00:00 2001
From: Alex Shinn <alexshinn@gmail.com>
Date: Thu, 15 Aug 2019 23:42:17 +0800
Subject: [PATCH] adding len limit on ffi auto-expand vars (issue #553)

---
 tools/chibi-ffi | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/tools/chibi-ffi b/tools/chibi-ffi
index d51a0475..7698e3ac 100755
--- a/tools/chibi-ffi
+++ b/tools/chibi-ffi
@@ -48,6 +48,8 @@
 (define *c++?* #f)
 (define wdir ".")
 
+(define auto-expand-limit (* 10 1024 1024))
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; type objects
 
@@ -1478,6 +1480,10 @@
                     (lambda ()
                       (let ((len (get-array-length func a))
                             (i (type-index a)))
+                        (cat "  if (len" i " > " auto-expand-limit ") {\n"
+                             "    res = sexp_user_exception(ctx, self, "
+                             "\"exceeded max auto-expand len in " (func-scheme-name func) "\", SEXP_NULL);\n"
+                             "} else {\n")
                         (if (number? len)
                             (cat "  if (len" i " != " len ")\n"
                                  "    free(tmp" i ");\n"))
@@ -1491,7 +1497,8 @@
                                              "")
                                          ")"))
                              " calloc(len" i ", sizeof(tmp" i "[0]));\n"
-                             "  goto loop;\n")))))
+                             "  goto loop;\n"
+                             "}\n")))))
               (error-return?
                ;; TODO: free other results
                "  res = SEXP_FALSE;\n")