summaryrefslogtreecommitdiff
path: root/elisp
diff options
context:
space:
mode:
authorJose Antonio Ortega Ruiz <jao@gnu.org>2013-07-29 02:34:22 +0200
committerJose Antonio Ortega Ruiz <jao@gnu.org>2013-07-29 02:34:22 +0200
commit25a81dc10945622a0a52e54ea0b818aa1deae326 (patch)
tree3e72947ec257935aefe1a94de5afa8a0b886b0cf /elisp
parent20a68166d0c05a18932bc784da5fe060fd3f32ae (diff)
downloadgeiser-guile-25a81dc10945622a0a52e54ea0b818aa1deae326.tar.gz
geiser-guile-25a81dc10945622a0a52e54ea0b818aa1deae326.tar.bz2
Avoiding a segfault due to out of bounds stack size
The parser in geiser-syntax is (tail, but elisp doesn't care) recursive, and we are setting max-lisp-eval-depth to some, ahem, heuristic value before starting a read. For long strings, such as that returned by the list of identifiers exported by the racket module, the heuristic was bad enough to produce a value making Emacs to blow away. This is just a palliative. The real solution is turn the recursion in geiser-syntax--read into an explicit iteration.
Diffstat (limited to 'elisp')
-rw-r--r--elisp/geiser-syntax.el3
1 files changed, 2 insertions, 1 deletions
diff --git a/elisp/geiser-syntax.el b/elisp/geiser-syntax.el
index d790734..7a33770 100644
--- a/elisp/geiser-syntax.el
+++ b/elisp/geiser-syntax.el
@@ -197,7 +197,8 @@ implementation-specific entries for font-lock-keywords.")
(when (stringp string)
(let* ((start (or start 0))
(end (or end (length string)))
- (max-lisp-eval-depth (max max-lisp-eval-depth (- end start))))
+ (max-lisp-eval-depth (min 20000
+ (max max-lisp-eval-depth (- end start)))))
(with-temp-buffer
(save-excursion (insert string))
(cons (ignore-errors (geiser-syntax--read)) (point))))))