Package: emacs;
Reported by: Sheng Yang (杨圣) <yangsheng6810 <at> gmail.com>
Date: Thu, 28 Jun 2018 17:02:02 UTC
Severity: normal
Tags: wontfix
Found in version 26.1
Done: Lars Ingebrigtsen <larsi <at> gnus.org>
Bug is archived. No further changes may be made.
To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 31995 in the body.
You can then email your comments to 31995 AT debbugs.gnu.org in the normal way.
Toggle the display of automated, internal messages from the tracker.
View this report as an mbox folder, status mbox, maintainer mbox
bug-gnu-emacs <at> gnu.org
:bug#31995
; Package emacs
.
(Thu, 28 Jun 2018 17:02:02 GMT) Full text and rfc822 format available.Sheng Yang (杨圣) <yangsheng6810 <at> gmail.com>
:bug-gnu-emacs <at> gnu.org
.
(Thu, 28 Jun 2018 17:02:02 GMT) Full text and rfc822 format available.Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
From: Sheng Yang (杨圣) <yangsheng6810 <at> gmail.com> To: bug-gnu-emacs <at> gnu.org Subject: 26.1; Condition-case failed to catch error Date: Thu, 28 Jun 2018 09:54:41 -0700
[Message part 1 (text/plain, inline)]
I was trying to read code of undo-tree when I encounter this problem. Here is a somewhat simplified version with some debug output (and the offending undo-tree file can be found in attachment or at https://dimlight.tk/~yangsheng/undo-tree): ''' (defun load-undo-tree-history () (interactive) (let ((filename "~/undo-tree")) (with-temp-buffer (insert-file-contents filename) (goto-char (point-min)) (condition-case err (progn (message "before reading hash") (setq hash (read (current-buffer))) (message "before reading tree") (setq tree (read (current-buffer))) (message "after reading tree")) (error (message "error caught"))) (message "outside condition-case") (kill-buffer nil)))) ''' The undo-tree file contains two lines, the first is a hash, and the second is a undo-tree structure printed with ~prin1~. Some error will happen in the second ~(read (current-buffer))~, so the expected behavior is the following output: ''' before reading hash before reading tree error caught outside condition-case ''' However, here is what I get. ''' before reading hash before reading tree Re-entering top level after C stack overflow ''' It seems that the function call ~(read (current-buffer))~ causes C stack overflow. Though I personally believe the undo-tree file is not corrupted, I assume this error should be caught by condition-case even if the file to read is indeed corrupted. I bisected with git (using current master head d0e2a341dd) and found the first commit that introduced this (not exactly the same) problem was commit f0a1e9ec3fba3d5bea5bd62f525dba3fb005d1b1 Author: Paul Eggert Date: Thu Dec 8 11:32:48 2016 -0800 Make read1 more reentrant This is needed if ‘read’ is called soon after startup, before the Unicode tables have been set up, and it reads a \N escape and needs to look up a value the Unicode tables, a lookup that in turn calls read1 recursively. Although this change doesn’t make ‘read’ fully reentrant, it’s good enough to handle this case. ,* src/lread.c (read_buffer_size, read_buffer): Remove static vars. (grow_read_buffer): Revamp to use locals, not statics, and to record memory allocation un the specpdl. All callers changed. (read1): Start with a stack-based buffer, and use the heap only if the stack buffer is too small. Use unbind_to to free any heap buffer allocated. Use bool for boolean. Redo symbol loop so that only one call to grow_read_buffer is needed. (init_obarray): Remove no-longer-needed initialization. Starting from this commit, the previous elisp code will crash emacs. An attempt to fix this problem is commit 9dee1c884eb50ba282eb9dd2495c5269add25963 Author: Paul Eggert Date: Fri Jul 14 04:54:05 2017 -0700 Improve stack-overflow heuristic on GNU/Linux Problem reported by Steve Kemp (Bug#27585). ,* src/eval.c (near_C_stack_top): Remove. All uses replaced by current_thread->stack_top. (record_in_backtrace): Set current_thread->stack_top. This is for when the Lisp interpreter calls itself. ,* src/lread.c (read1): Set current_thread->stack_top. This is for recursive s-expression reads. ,* src/print.c (print_object): Set current_thread->stack_top. This is for recursive s-expression printing. ,* src/thread.c (mark_one_thread): Get stack top first. ,* src/thread.h (struct thread_state.stack_top): Now void *, not char *. This commit fixed the crashing problem, but error catching still does not work. As indicated in commit 9dee1c88, this commit tries to fix Bug#27585, where Steve Kemp triggered it with a huge number of '`' or ',' . Wrapping these '`' or ',' with condition-case can also trigger the problem. Configured using: 'configure --prefix=/usr --sysconfdir=/etc --libexecdir=/usr/lib --localstatedir=/var --with-x-toolkit=gtk3 --with-xft --with-modules 'CFLAGS=-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt' CPPFLAGS=-D_FORTIFY_SOURCE=2 LDFLAGS=-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now' Configured features: XPM JPEG TIFF GIF PNG RSVG IMAGEMAGICK SOUND GPM DBUS GSETTINGS NOTIFY ACL GNUTLS LIBXML2 FREETYPE M17N_FLT LIBOTF XFT ZLIB TOOLKIT_SCROLL_BARS GTK3 X11 MODULES THREADS LIBSYSTEMD LCMS2 Important settings: value of $LANG: zh_CN.utf-8 value of $XMODIFIERS: @im=fcitx locale-coding-system: utf-8-unix Major mode: Spacemacs buffer Minor modes in effect: highlight-changes-visible-mode: t TeX-PDF-mode: t TeX-source-correlate-mode: t global-vi-tilde-fringe-mode: t pupo-mode: t purpose-mode: t spaceline-info-mode: t spaceline-helm-mode: t projectile-mode: t company-statistics-mode: t eval-sexp-fu-flash-mode: t global-semanticdb-minor-mode: t recentf-mode: t global-semantic-idle-scheduler-mode: t global-semantic-idle-summary-mode: t flycheck-pos-tip-mode: t global-flycheck-mode: t yas-global-mode: t yas-minor-mode: t global-atomic-chrome-edit-mode: t dired-omit-mode: t engine-mode: t company-quickhelp-mode: t company-quickhelp-local-mode: t pdf-occur-global-minor-mode: t global-semantic-stickyfunc-mode: t semantic-mode: t show-smartparens-global-mode: t show-smartparens-mode: t flyspell-lazy-mode: t global-magit-file-mode: t diff-auto-refine-mode: t winner-mode: t winum-mode: t save-place-mode: t savehist-mode: t persp-mode: t global-pangu-spacing-mode: t pangu-spacing-mode: t global-git-gutter+-mode: t global-git-commit-mode: t async-bytecomp-package-mode: t flx-ido-mode: t eyebrowse-mode: t global-evil-surround-mode: t evil-surround-mode: t evil-lion-mode: t evil-escape-mode: t global-anzu-mode: t anzu-mode: t editorconfig-mode: t counsel-mode: t ivy-mode: t clean-aindent-mode: t ace-pinyin-global-mode: t ace-pinyin-mode: t which-key-mode: t override-global-mode: t global-undo-tree-mode: t undo-tree-mode: t evil-mode: t evil-local-mode: t spacemacs-leader-override-mode: t global-spacemacs-leader-override-mode: t global-hl-line-mode: t xterm-mouse-mode: t global-auto-revert-mode: t shell-dirtrack-mode: t ido-vertical-mode: t global-page-break-lines-mode: t page-break-lines-mode: t global-eldoc-mode: t electric-indent-mode: t mouse-wheel-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t buffer-read-only: t column-number-mode: t line-number-mode: t transient-mark-mode: t Load-path shadows: /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-plot hides /usr/share/emacs/26.1/lisp/org/org-plot /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-stan hides /usr/share/emacs/26.1/lisp/org/ob-stan /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-processing hides /usr/share/emacs/26.1/lisp/org/ob-processing /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-colview hides /usr/share/emacs/26.1/lisp/org/org-colview /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ox-man hides /usr/share/emacs/26.1/lisp/org/ox-man /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ox-org hides /usr/share/emacs/26.1/lisp/org/ox-org /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-makefile hides /usr/share/emacs/26.1/lisp/org/ob-makefile /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-org hides /usr/share/emacs/26.1/lisp/org/ob-org /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-gnus hides /usr/share/emacs/26.1/lisp/org/org-gnus /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-sed hides /usr/share/emacs/26.1/lisp/org/ob-sed /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-java hides /usr/share/emacs/26.1/lisp/org/ob-java /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ox-latex hides /usr/share/emacs/26.1/lisp/org/ox-latex /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-habit hides /usr/share/emacs/26.1/lisp/org/org-habit /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-feed hides /usr/share/emacs/26.1/lisp/org/org-feed /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-duration hides /usr/share/emacs/26.1/lisp/org/org-duration /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-calc hides /usr/share/emacs/26.1/lisp/org/ob-calc /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-css hides /usr/share/emacs/26.1/lisp/org/ob-css /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-protocol hides /usr/share/emacs/26.1/lisp/org/org-protocol /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-timer hides /usr/share/emacs/26.1/lisp/org/org-timer /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-J hides /usr/share/emacs/26.1/lisp/org/ob-J /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ox-icalendar hides /usr/share/emacs/26.1/lisp/org/ox-icalendar /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-forth hides /usr/share/emacs/26.1/lisp/org/ob-forth /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-C hides /usr/share/emacs/26.1/lisp/org/ob-C /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-lilypond hides /usr/share/emacs/26.1/lisp/org/ob-lilypond /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-list hides /usr/share/emacs/26.1/lisp/org/org-list /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-inlinetask hides /usr/share/emacs/26.1/lisp/org/org-inlinetask /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-loaddefs hides /usr/share/emacs/26.1/lisp/org/org-loaddefs /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-agenda hides /usr/share/emacs/26.1/lisp/org/org-agenda /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-ctags hides /usr/share/emacs/26.1/lisp/org/org-ctags /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ox-ascii hides /usr/share/emacs/26.1/lisp/org/ox-ascii /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-indent hides /usr/share/emacs/26.1/lisp/org/org-indent /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-gnuplot hides /usr/share/emacs/26.1/lisp/org/ob-gnuplot /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-mobile hides /usr/share/emacs/26.1/lisp/org/org-mobile /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-info hides /usr/share/emacs/26.1/lisp/org/org-info /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-irc hides /usr/share/emacs/26.1/lisp/org/org-irc /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-ledger hides /usr/share/emacs/26.1/lisp/org/ob-ledger /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-asymptote hides /usr/share/emacs/26.1/lisp/org/ob-asymptote /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-io hides /usr/share/emacs/26.1/lisp/org/ob-io /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-fortran hides /usr/share/emacs/26.1/lisp/org/ob-fortran /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ox hides /usr/share/emacs/26.1/lisp/org/ox /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-w3m hides /usr/share/emacs/26.1/lisp/org/org-w3m /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-compat hides /usr/share/emacs/26.1/lisp/org/org-compat /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-mouse hides /usr/share/emacs/26.1/lisp/org/org-mouse /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-sass hides /usr/share/emacs/26.1/lisp/org/ob-sass /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-ocaml hides /usr/share/emacs/26.1/lisp/org/ob-ocaml /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-faces hides /usr/share/emacs/26.1/lisp/org/org-faces /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-python hides /usr/share/emacs/26.1/lisp/org/ob-python /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-perl hides /usr/share/emacs/26.1/lisp/org/ob-perl /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-vala hides /usr/share/emacs/26.1/lisp/org/ob-vala /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-scheme hides /usr/share/emacs/26.1/lisp/org/ob-scheme /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-ref hides /usr/share/emacs/26.1/lisp/org/ob-ref /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-footnote hides /usr/share/emacs/26.1/lisp/org/org-footnote /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-entities hides /usr/share/emacs/26.1/lisp/org/org-entities /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-element hides /usr/share/emacs/26.1/lisp/org/org-element /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-table hides /usr/share/emacs/26.1/lisp/org/ob-table /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-crypt hides /usr/share/emacs/26.1/lisp/org/org-crypt /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ox-publish hides /usr/share/emacs/26.1/lisp/org/ox-publish /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-clock hides /usr/share/emacs/26.1/lisp/org/org-clock /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-R hides /usr/share/emacs/26.1/lisp/org/ob-R /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-src hides /usr/share/emacs/26.1/lisp/org/org-src /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-ebnf hides /usr/share/emacs/26.1/lisp/org/ob-ebnf /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-macs hides /usr/share/emacs/26.1/lisp/org/org-macs /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-clojure hides /usr/share/emacs/26.1/lisp/org/ob-clojure /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-haskell hides /usr/share/emacs/26.1/lisp/org/ob-haskell /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-tangle hides /usr/share/emacs/26.1/lisp/org/ob-tangle /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-rmail hides /usr/share/emacs/26.1/lisp/org/org-rmail /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-bbdb hides /usr/share/emacs/26.1/lisp/org/org-bbdb /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-bibtex hides /usr/share/emacs/26.1/lisp/org/org-bibtex /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-lob hides /usr/share/emacs/26.1/lisp/org/ob-lob /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-groovy hides /usr/share/emacs/26.1/lisp/org/ob-groovy /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-lua hides /usr/share/emacs/26.1/lisp/org/ob-lua /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-lisp hides /usr/share/emacs/26.1/lisp/org/ob-lisp /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ox-html hides /usr/share/emacs/26.1/lisp/org/ox-html /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-keys hides /usr/share/emacs/26.1/lisp/org/ob-keys /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-ruby hides /usr/share/emacs/26.1/lisp/org/ob-ruby /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-mscgen hides /usr/share/emacs/26.1/lisp/org/ob-mscgen /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-abc hides /usr/share/emacs/26.1/lisp/org/ob-abc /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-core hides /usr/share/emacs/26.1/lisp/org/ob-core /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-maxima hides /usr/share/emacs/26.1/lisp/org/ob-maxima /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-ditaa hides /usr/share/emacs/26.1/lisp/org/ob-ditaa /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob hides /usr/share/emacs/26.1/lisp/org/ob /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-sqlite hides /usr/share/emacs/26.1/lisp/org/ob-sqlite /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-eshell hides /usr/share/emacs/26.1/lisp/org/org-eshell /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-lint hides /usr/share/emacs/26.1/lisp/org/org-lint /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-table hides /usr/share/emacs/26.1/lisp/org/org-table /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-datetree hides /usr/share/emacs/26.1/lisp/org/org-datetree /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-js hides /usr/share/emacs/26.1/lisp/org/ob-js /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ox-md hides /usr/share/emacs/26.1/lisp/org/ox-md /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ox-beamer hides /usr/share/emacs/26.1/lisp/org/ox-beamer /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-hledger hides /usr/share/emacs/26.1/lisp/org/ob-hledger /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ox-odt hides /usr/share/emacs/26.1/lisp/org/ox-odt /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-dot hides /usr/share/emacs/26.1/lisp/org/ob-dot /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-archive hides /usr/share/emacs/26.1/lisp/org/org-archive /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-pcomplete hides /usr/share/emacs/26.1/lisp/org/org-pcomplete /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-shen hides /usr/share/emacs/26.1/lisp/org/ob-shen /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ox-texinfo hides /usr/share/emacs/26.1/lisp/org/ox-texinfo /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-octave hides /usr/share/emacs/26.1/lisp/org/ob-octave /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-picolisp hides /usr/share/emacs/26.1/lisp/org/ob-picolisp /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-macro hides /usr/share/emacs/26.1/lisp/org/org-macro /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-plantuml hides /usr/share/emacs/26.1/lisp/org/ob-plantuml /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org hides /usr/share/emacs/26.1/lisp/org/org /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-sql hides /usr/share/emacs/26.1/lisp/org/ob-sql /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-emacs-lisp hides /usr/share/emacs/26.1/lisp/org/ob-emacs-lisp /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-coq hides /usr/share/emacs/26.1/lisp/org/ob-coq /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-matlab hides /usr/share/emacs/26.1/lisp/org/ob-matlab /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-docview hides /usr/share/emacs/26.1/lisp/org/org-docview /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-id hides /usr/share/emacs/26.1/lisp/org/org-id /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-exp hides /usr/share/emacs/26.1/lisp/org/ob-exp /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-shell hides /usr/share/emacs/26.1/lisp/org/ob-shell /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-eww hides /usr/share/emacs/26.1/lisp/org/org-eww /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-attach hides /usr/share/emacs/26.1/lisp/org/org-attach /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-capture hides /usr/share/emacs/26.1/lisp/org/org-capture /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-install hides /usr/share/emacs/26.1/lisp/org/org-install /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-mhe hides /usr/share/emacs/26.1/lisp/org/org-mhe /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-latex hides /usr/share/emacs/26.1/lisp/org/ob-latex /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-comint hides /usr/share/emacs/26.1/lisp/org/ob-comint /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-awk hides /usr/share/emacs/26.1/lisp/org/ob-awk /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/org-version hides /usr/share/emacs/26.1/lisp/org/org-version /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-eval hides /usr/share/emacs/26.1/lisp/org/ob-eval /home/yangsheng/.emacs.d/elpa/26.1/develop/org-plus-contrib-20180611/ob-screen hides /usr/share/emacs/26.1/lisp/org/ob-screen Features: (shadow emacsbug mailalias mailclient sendmail qp mail-extr sort view reftex-global magit-ediff evil-ediff ediff-merg ediff-wind ediff-diff ediff-mult ediff-help ediff-init ediff-util ediff vc vc-dispatcher gravatar url-cache org-timer org-clock expand-region text-mode-expansions cc-mode-expansions the-org-mode-expansions ruby-mode-expansions python-el-fgallina-expansions latex-mode-expansions js2-mode-expansions js-mode-expansions web-mode-expansions html-mode-expansions css-mode-expansions er-basic-expansions expand-region-core expand-region-custom hide-comnt helm-find handwrite hangul hanja-util quail helm-id-utils cal-bahai helm-sys helm-color simple-httpd helm-eshell cal-china-x help-at-pt highlight-indentation helm-config helm-easymenu helm-semantic helm-man hashcash helm-ring cal-hebrew helm-dabbrev htmlfontify htmlfontify-loaddefs files-x mmm-erb mmm-region mmm-auto mmm-vars mmm-utils mmm-compat helm-for-files helm-bookmark helm-external helm-net helm-command helm-mode helm-org cal-islam tutorial helm-elisp helm-files helm-buffers helm-tags helm-locate helm-eval edebug helm-info holidays hol-loaddefs hexl helm-make htmlize helm-grep helm-regexp helm-adaptive helm-misc helm-types helm-elisp-package helm-font haml-mode smartparens-markdown markdown-mode css-mode eww smartparens-ruby ruby-mode hanoi helm-imenu helm-utils helm-help hilit-chg hungry-delete helm helm-source helm-multi-match helm-lib canlock use-package-lint use-package-jump whitespace semantic/tag-write fill-column-indicator magit-gitflow pcre2el rxt re-builder semantic/edit semantic/analyze/complete semantic/db-typecache org-duration cal-julian diary-lib diary-loaddefs cal-iso org-agenda tabify elfeed-link org-projectile org-category-capture org-capture reftex-index reftex-sel reftex-ref reftex-cite reftex-parse texmathp pdf-sync pdf-annot pdf-outline pdf-links pdf-history latexenc paren hippie-exp company-web-html company-web company-css web-completion-data emmet-mode web-mode ibuffer-projectile timezone elfeed-goodies-logging elfeed-goodies-new-entry-hooks mm-url elfeed-goodies-split-pane elfeed-goodies-show-mode noflet cl-indent elfeed-goodies-search-mode elfeed-goodies elfeed-org elfeed-show elfeed-search shr svg elfeed-csv elfeed elfeed-curl elfeed-log elfeed-db elfeed-lib url-queue browse-url xml-query conf-mode company-shell flycheck-bashate sh-script smie executable preview prv-emacs company-auctex tex-fold reftex-dcr reftex-auc reftex reftex-loaddefs reftex-vars font-latex auctex-latexmk tex-buf latex latex-flymake flymake-proc flymake tex-ispell tex-style tex smartparens-latex tex-mode cl-print debug two-column iso-transl network-stream starttls importmagic anaconda-mode pythonic hi-lock evil-matchit evil-matchit-sdk semantic/wisent/python semantic/wisent/python-wy smartparens-python python semantic/decorate/mode org-eldoc org-journal org-crypt evil-org org-table ob-python ob-C ob-js ob-shell ob-latex org-bullets org-download toc-org image-file org-rmail org-mhe org-irc org-info org-gnus nnir gnus-sum gnus-group gnus-undo gnus-start gnus-cloud nnimap nnmail mail-source utf7 netrc nnoo gnus-spec gnus-int gnus-range gnus-win gnus nnheader org-docview doc-view org-bibtex bibtex org-bbdb org-w3m vc-git flycheck-rust stickyfunc-enhance company-c-headers semantic/db-file data-debug cedet-files ggtags ewoc tramp-cache tramp-sh colir smex vi-tilde-fringe spacemacs-purpose-popwin window-purpose-x imenu-list window-purpose window-purpose-fixes window-purpose-prefix-overload window-purpose-switch window-purpose-layout spaceline-config spaceline-segments spaceline powerline powerline-separators powerline-themes projectile grep company-statistics company-files company-keywords company-etags company-gtags company-template company-dabbrev-code company-dabbrev company-yasnippet company-capf overseer pkg-info epl auto-compile packed elisp-slime-nav eval-sexp-fu highlight font-lock+ frame-fns avoid semantic/db-mode srefactor srefactor-ui recentf tree-widget srecode/semantic semantic/senator semantic/decorate srecode/insert srecode/filters srecode/args ede/speedbar ede/files ede ede/detect ede/base ede/auto ede/source eieio-speedbar eieio-custom srecode/find srecode/map srecode/ctxt srecode/compile srecode/dictionary srecode/table srecode semantic/doc semantic/bovine/c hideif semantic/bovine/c-by semantic/lex-spp semantic/idle semantic/bovine/gcc semantic/dep semantic/analyze/refs semantic/db-find semantic/db-ref semantic/analyze semantic/sort semantic/scope semantic/analyze/fcn goto-addr bug-reference auto-highlight-symbol evil-lisp-state flycheck-pos-tip flycheck highlight-numbers parent-mode highlight-parentheses hideshow rainbow-delimiters yasnippet-snippets yasnippet rainbow-mode color elec-pair window-purpose-core window-purpose-configuration window-purpose-utils atomic-chrome websocket bindat cnfonts cnfonts-ui cal-china lunar solar cal-dst eterm-256color term ehelp dired-x ranger ivy-rich engine-mode company-jed -- Sheng Yang(杨圣) PhD student Computer Science Department University of Maryland, College Park E-mail:yangsheng6810 <at> gmail.com
[Message part 2 (text/html, inline)]
[undo-tree (text/plain, attachment)]
Noam Postavsky <npostavs <at> gmail.com>
to control <at> debbugs.gnu.org
.
(Wed, 11 Jul 2018 21:49:02 GMT) Full text and rfc822 format available.Noam Postavsky <npostavs <at> gmail.com>
to control <at> debbugs.gnu.org
.
(Wed, 11 Jul 2018 21:49:02 GMT) Full text and rfc822 format available.bug-gnu-emacs <at> gnu.org
:bug#31995
; Package emacs
.
(Wed, 11 Jul 2018 21:50:02 GMT) Full text and rfc822 format available.Message #12 received at 31995 <at> debbugs.gnu.org (full text, mbox):
From: Noam Postavsky <npostavs <at> gmail.com> To: Sheng Yang (杨圣) <yangsheng6810 <at> gmail.com> Cc: 31995 <at> debbugs.gnu.org Subject: Re: bug#31995: 26.1; Condition-case failed to catch error Date: Wed, 11 Jul 2018 17:48:53 -0400
retitle 31995 Condition-case can't catch C stack overflow tags 31995 + wontfix quit Sheng Yang (杨圣) <yangsheng6810 <at> gmail.com> writes: > It seems that the function call ~(read (current-buffer))~ causes C stack > overflow. Though I personally believe the undo-tree file is not > corrupted, I assume this error should be caught by condition-case even > if the file to read is indeed corrupted. The file is not corrupted, it's just that the recursion goes too deep during reading. However, I don't think condition-case can reasonably catch C stack overflow. As it is, recovering from C stack overflow at all is a bit controversial, which is why we have the attempt-stack-overflow-recovery variable which you can set to nil in order to reliably segfault instead.
bug-gnu-emacs <at> gnu.org
:bug#31995
; Package emacs
.
(Thu, 12 Jul 2018 05:47:02 GMT) Full text and rfc822 format available.Message #15 received at 31995 <at> debbugs.gnu.org (full text, mbox):
From: Sheng Yang (杨圣) <yangsheng6810 <at> gmail.com> To: Noam Postavsky <npostavs <at> gmail.com> Cc: 31995 <at> debbugs.gnu.org Subject: Re: bug#31995: 26.1; Condition-case failed to catch error Date: Wed, 11 Jul 2018 22:46:21 -0700
[Message part 1 (text/plain, inline)]
condition-case was able to catch C stack overflow before commit f0a1e9ec. I understand that recovering from C stack overflow is magical and can be tricky, but emacs is capable of this thanks to all of your efforts. The only part missing is re-throwing this as a lisp exception, which should not be as hard as recovering from C stack overflow. Here is why this feature can be important. When we open a file, find-file-hook will call many functions, including but not limited to undo-tree. These functions read additional files (undo-tree, project file, dir-local, etc.) and perform tasks. To guard against file corruption and other problems, all reads are wrapped in some try-catch clause. However, the trust in these try-catch clauses are let down, and a single file corruption (or a file that can cause C stack overflow) ruins the whole process of loading file with a mysterious message of"Recovered from C stack overflow". I don't think this is acceptable. From a lisp programmer's perspective, if exceptions should occur, they should be caught. This is exactly the behavior that condition-case and other try-catch clause promise. I am not an expert in C, debugging the C part of emacs can be painful for me. Therefore I bisected and found the offending commits (see my original bug report). Hope this can help you pin point the problem and fix the bug. On 07/11/2018 02:48 PM, Noam Postavsky wrote: > retitle 31995 Condition-case can't catch C stack overflow > tags 31995 + wontfix > quit > > Sheng Yang (杨圣) <yangsheng6810 <at> gmail.com> writes: > >> It seems that the function call ~(read (current-buffer))~ causes C stack >> overflow. Though I personally believe the undo-tree file is not >> corrupted, I assume this error should be caught by condition-case even >> if the file to read is indeed corrupted. > The file is not corrupted, it's just that the recursion goes too deep > during reading. However, I don't think condition-case can reasonably > catch C stack overflow. As it is, recovering from C stack overflow at > all is a bit controversial, which is why we have the > attempt-stack-overflow-recovery variable which you can set to nil in > order to reliably segfault instead. -- Sheng Yang(杨圣) PhD student Computer Science Department University of Maryland, College Park E-mail:yangsheng6810 <at> gmail.com
[Message part 2 (text/html, inline)]
bug-gnu-emacs <at> gnu.org
:bug#31995
; Package emacs
.
(Fri, 13 Jul 2018 00:30:01 GMT) Full text and rfc822 format available.Message #18 received at 31995 <at> debbugs.gnu.org (full text, mbox):
From: Sheng Yang (杨圣) <yangsheng6810 <at> gmail.com> To: Noam Postavsky <npostavs <at> gmail.com> Cc: Paul Eggert <eggert <at> cs.ucla.edu>, 31995 <at> debbugs.gnu.org Subject: Re: bug#31995: 26.1; Condition-case failed to catch error Date: Thu, 12 Jul 2018 17:29:44 -0700
[Message part 1 (text/plain, inline)]
@Paul Eggert: I am cc-ing you because you are the author of commit f0a1e9ec and may be more familiar with this topic. Please ignore my previous email, I thought condition-case WAS able to catch C stack overflow before commit f0a1e9ec, but it seems not the case, or at least not related to this bug. After some code reading and debugging, I find the problem: in commit f0a1e9ec, the read_buffer for read1 is moved from a static variable to an array stackbuf of size MAX_ALLOCA located on stack. MAX_ALLOCA is defined to be 16 * 1024. So every recursion of read1 will eat up 16KB of stack, and thousands of recursions (not uncommon for a deeply nested structure) quickly use up whole stack and cause stack overflow. One solution is to make stackbuf much smaller. I set it to 16, and this bug disappeared. Though 16 may be too aggressive, 16 * 1024 is way too big for a stack-based buffer in a function that may recur thousands of times. To make things worse, the buffer is totally a waste of space when read1 is dealing with everything ("[", "]", "(", ")", "#", "=", numbers, etc.) other than the name of a symbol (usually tens of characters) or a string, which is the only case when we would need a really long buffer. A conservative choice would be a number higher than 40 or 80, making the buffer long enough to hold any symbol, as people usually do not have symbol longer than the one of half the width of a terminal. A more aggressive choice is to totally remove the buffer and only allocate it on heap. This comes at a cost of possible slow down because memory allocation on heap is usually slower than on stack. The reason why this was not the case before commit f0a1e9ec is that this buffer is reused by every recursion of read1, and is not a problem. As a reference, MAX_ALLOCA is defined in src/lisp.h for SAFE_ALLOCA, which allocate memory on stack if its size is less than MAX_ALLOCA, and allocate memory on heap otherwise. The usage for SAFE_ALLOCA and a preparation macro USE_SAFE_ALLOCA seems pretty complicated and I am not able to figure out. On 07/11/2018 10:46 PM, Sheng Yang (杨圣) wrote: > condition-case was able to catch C stack overflow before commit > f0a1e9ec. I understand that recovering from C stack overflow is > magical and can be tricky, but emacs is capable of this thanks to all > of your efforts. The only part missing is re-throwing this as a lisp > exception, which should not be as hard as recovering from C stack > overflow. > > Here is why this feature can be important. When we open a file, > find-file-hook will call many functions, including but not limited to > undo-tree. These functions read additional files (undo-tree, project > file, dir-local, etc.) and perform tasks. To guard against file > corruption and other problems, all reads are wrapped in some try-catch > clause. However, the trust in these try-catch clauses are let down, > and a single file corruption (or a file that can cause C stack > overflow) ruins the whole process of loading file with a mysterious > message of"Recovered from C stack overflow". I don't think this is > acceptable. > > From a lisp programmer's perspective, if exceptions should occur, they > should be caught. This is exactly the behavior that condition-case and > other try-catch clause promise. > > I am not an expert in C, debugging the C part of emacs can be painful > for me. Therefore I bisected and found the offending commits (see my > original bug report). Hope this can help you pin point the problem and > fix the bug. > > On 07/11/2018 02:48 PM, Noam Postavsky wrote: >> retitle 31995 Condition-case can't catch C stack overflow >> tags 31995 + wontfix >> quit >> >> Sheng Yang (杨圣) <yangsheng6810 <at> gmail.com> writes: >> >>> It seems that the function call ~(read (current-buffer))~ causes C stack >>> overflow. Though I personally believe the undo-tree file is not >>> corrupted, I assume this error should be caught by condition-case even >>> if the file to read is indeed corrupted. >> The file is not corrupted, it's just that the recursion goes too deep >> during reading. However, I don't think condition-case can reasonably >> catch C stack overflow. As it is, recovering from C stack overflow at >> all is a bit controversial, which is why we have the >> attempt-stack-overflow-recovery variable which you can set to nil in >> order to reliably segfault instead. > > -- > Sheng Yang(杨圣) > PhD student > Computer Science Department > University of Maryland, College Park > E-mail:yangsheng6810 <at> gmail.com -- Sheng Yang(杨圣) PhD student Computer Science Department University of Maryland, College Park E-mail:yangsheng6810 <at> gmail.com
[Message part 2 (text/html, inline)]
bug-gnu-emacs <at> gnu.org
:bug#31995
; Package emacs
.
(Fri, 13 Jul 2018 03:44:01 GMT) Full text and rfc822 format available.Message #21 received at 31995 <at> debbugs.gnu.org (full text, mbox):
From: Paul Eggert <eggert <at> cs.ucla.edu> To: Sheng Yang (杨圣) <yangsheng6810 <at> gmail.com>, Noam Postavsky <npostavs <at> gmail.com> Cc: 31995 <at> debbugs.gnu.org Subject: Re: bug#31995: 26.1; Condition-case failed to catch error Date: Thu, 12 Jul 2018 22:43:38 -0500
[Message part 1 (text/plain, inline)]
On 07/12/2018 07:29 PM, Sheng Yang (杨圣) wrote: > the buffer is totally a waste of space when read1 is dealing with > everything ("[", "]", "(", ")", "#", "=", numbers, etc.) other than > the name of a symbol (usually tens of characters) or a string Thanks for reporting this. I attempted to work around the immediate problem by installing the attached into the emacs-26 branch. Although this doesn't address the overall problem of stack overflow, that is less pressing.
[0001-Lessen-stack-consumption-in-recursive-read1.patch (text/x-patch, attachment)]
Lars Ingebrigtsen <larsi <at> gnus.org>
to control <at> debbugs.gnu.org
.
(Thu, 27 Jun 2019 22:45:01 GMT) Full text and rfc822 format available.Debbugs Internal Request <help-debbugs <at> gnu.org>
to internal_control <at> debbugs.gnu.org
.
(Fri, 26 Jul 2019 11:24:10 GMT) Full text and rfc822 format available.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.