GNU bug report logs - #69785
29.2; Image mode can loop due to invalid images

Previous Next

Package: emacs;

Reported by: Rahguzar <rahguzar <at> zohomail.eu>

Date: Wed, 13 Mar 2024 21:39:02 UTC

Severity: normal

Found in version 29.2

Done: Eli Zaretskii <eliz <at> gnu.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 69785 in the body.
You can then email your comments to 69785 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


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#69785; Package emacs. (Wed, 13 Mar 2024 21:39:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Rahguzar <rahguzar <at> zohomail.eu>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Wed, 13 Mar 2024 21:39:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Rahguzar <rahguzar <at> zohomail.eu>
To: bug-gnu-emacs <at> gnu.org
Subject: 29.2; Image mode can loop due to invalid images
Date: Wed, 13 Mar 2024 22:13:55 +0100
Dear Emacs developers,

Starting with emacs -Q, evaluate

(with-current-buffer (get-buffer-create "*image-mode-test*")
  (insert (propertize "abc" 'display (list 'image "Definitely not an image.")))
  (image-mode))

twice.

The second time results in an error and pop ups the debugger, with the
following text,

Debugger entered--Lisp error: (excessive-lisp-nesting 1601)
  display-images-p()
  image-mode()
  major-mode-restore((image-mode image-mode-as-text))
  image-mode-to-text()
  image-mode-as-text()
  image-mode--display()
  image-mode()
  major-mode-restore((image-mode image-mode-as-text))
  image-mode-to-text()
  image-mode-as-text()
  image-mode--display()
  image-mode()
  major-mode-restore((image-mode image-mode-as-text))
  image-mode-to-text()
  image-mode-as-text()
  image-mode--display()
  image-mode()
  ...

It is unclear to me why this doesn't happen the first time but I think
sequence causing it the second time is as follows:

1. 'image-mode' calls 'major-mode-suspend' when 'major' mode is
'fundamental-mode'. So 'major-mode--suspended' is not set.

2. 'image-mode--display' catches error and call 'image-mode-as-text'
which calls 'image-mode-to-text'.

3. 'image-mode-as-text' calls 'major-mode-restore' with '(image-mode
image-mode-as-text) as mode to avoid.

4. Since major-mode--suspended was not set in step 1
'major-mode-restore' falls back to 'normal-mode' which calls
'image-mode' causing the loop.

I think the simplest way of fixing this is to make sure that
'image-mode' doesn't call 'major-mode-suspend' with 'fundamental-mode'
instead calling 'text-mode' or 'special-mode' before calling
'major-mode-suspend' if it starts in 'fundamental-mode'.

Thanks,
Rahguzar


In GNU Emacs 29.2 (build 1, aarch64-redhat-linux-gnu, GTK+ Version
 3.24.41, cairo version 1.18.0) of 2024-02-02 built on
 4f70ed73c5a14276aae52125608014aa
System Description: Fedora Linux Asahi Remix 39 (Thirty Nine)

Configured using:
 'configure --build=aarch64-redhat-linux --host=aarch64-redhat-linux
 --program-prefix= --disable-dependency-tracking --prefix=/usr
 --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin
 --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include
 --libdir=/usr/lib64 --libexecdir=/usr/libexec --localstatedir=/var
 --runstatedir=/run --sharedstatedir=/var/lib --mandir=/usr/share/man
 --infodir=/usr/share/info --with-cairo --with-dbus --with-gif
 --with-gpm=no --with-harfbuzz --with-jpeg --with-json --with-modules
 --with-native-compilation=aot --with-pgtk --with-png --with-rsvg
 --with-sqlite3 --with-tiff --with-tree-sitter --with-webp --with-xpm
 --with-xwidgets build_alias=aarch64-redhat-linux
 host_alias=aarch64-redhat-linux CC=gcc 'CFLAGS=-DMAIL_USE_LOCKF -O2
 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches
 -pipe -Wall -Werror=format-security
 -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS
 -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong
 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1
 -mbranch-protection=standard -fasynchronous-unwind-tables
 -fstack-clash-protection -fno-omit-frame-pointer
 -mno-omit-leaf-frame-pointer ' LDFLAGS=-Wl,-z,relro
 PKG_CONFIG_PATH=:/usr/lib64/pkgconfig:/usr/share/pkgconfig CXX=g++
 'CXXFLAGS=-O2 -flto=auto -ffat-lto-objects -fexceptions -g
 -grecord-gcc-switches -pipe -Wall -Werror=format-security
 -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS
 -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong
 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1
 -mbranch-protection=standard -fasynchronous-unwind-tables
 -fstack-clash-protection -fno-omit-frame-pointer
 -mno-omit-leaf-frame-pointer ''

Configured features:
ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GSETTINGS HARFBUZZ JPEG JSON
LIBOTF LIBSELINUX LIBSYSTEMD LIBXML2 MODULES NATIVE_COMP NOTIFY INOTIFY
PDUMPER PGTK PNG RSVG SECCOMP SOUND SQLITE3 THREADS TIFF
TOOLKIT_SCROLL_BARS TREE_SITTER WEBP XIM XWIDGETS GTK3 ZLIB

Important settings:
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: mu4e:main

Minor modes in effect:
  global-evil-surround-mode: t
  evil-surround-mode: t
  shell-dirtrack-mode: t
  recentf-mode: t
  save-place-mode: t
  global-so-long-mode: t
  which-key-mode: t
  savehist-mode: t
  better-jumper-mode: t
  better-jumper-local-mode: t
  global-company-mode: t
  company-mode: t
  vertico-multiform-mode: t
  vertico-mode: t
  nerd-icons-completion-mode: t
  marginalia-mode: t
  evil-goggles-mode: t
  evil-escape-mode: t
  evil-snipe-override-mode: t
  evil-snipe-mode: t
  gcmh-mode: t
  winner-mode: t
  smartparens-global-mode: t
  ws-butler-global-mode: t
  undo-fu-session-global-mode: t
  undo-fu-mode: t
  satchel-mode: t
  mu4e-search-minor-mode: t
  global-hl-line-mode: t
  hl-line-mode: t
  mu4e-update-minor-mode: t
  mu4e-context-minor-mode: t
  dirvish-override-dired-mode: t
  server-mode: t
  pixel-scroll-precision-mode: t
  repeat-mode: t
  midnight-mode: t
  evil-mode: t
  evil-local-mode: t
  +popup-mode: t
  +modeline-global-mode: t
  +modeline-mode: t
  global-ligature-mode: t
  ligature-mode: t
  general-override-mode: t
  global-eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  window-divider-mode: t
  buffer-read-only: t
  size-indication-mode: t
  line-number-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  abbrev-mode: t

Load-path shadows:
/home/azeem/.emacs.d/.local/straight/build-29.2/emacsql/emacsql-sqlite-builtin hides /home/azeem/.emacs.d/.local/straight/build-29.2/emacsql-sqlite-builtin/emacsql-sqlite-builtin
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e hides /usr/share/emacs/site-lisp/mu4e/mu4e
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-window hides /usr/share/emacs/site-lisp/mu4e/mu4e-window
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-view hides /usr/share/emacs/site-lisp/mu4e/mu4e-view
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-vars hides /usr/share/emacs/site-lisp/mu4e/mu4e-vars
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-update hides /usr/share/emacs/site-lisp/mu4e/mu4e-update
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-speedbar hides /usr/share/emacs/site-lisp/mu4e/mu4e-speedbar
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-server hides /usr/share/emacs/site-lisp/mu4e/mu4e-server
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-search hides /usr/share/emacs/site-lisp/mu4e/mu4e-search
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-query-items hides /usr/share/emacs/site-lisp/mu4e/mu4e-query-items
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-org hides /usr/share/emacs/site-lisp/mu4e/mu4e-org
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-obsolete hides /usr/share/emacs/site-lisp/mu4e/mu4e-obsolete
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-notification hides /usr/share/emacs/site-lisp/mu4e/mu4e-notification
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-modeline hides /usr/share/emacs/site-lisp/mu4e/mu4e-modeline
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-message hides /usr/share/emacs/site-lisp/mu4e/mu4e-message
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-mark hides /usr/share/emacs/site-lisp/mu4e/mu4e-mark
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-main hides /usr/share/emacs/site-lisp/mu4e/mu4e-main
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-lists hides /usr/share/emacs/site-lisp/mu4e/mu4e-lists
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-icalendar hides /usr/share/emacs/site-lisp/mu4e/mu4e-icalendar
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-helpers hides /usr/share/emacs/site-lisp/mu4e/mu4e-helpers
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-headers hides /usr/share/emacs/site-lisp/mu4e/mu4e-headers
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-folders hides /usr/share/emacs/site-lisp/mu4e/mu4e-folders
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-draft hides /usr/share/emacs/site-lisp/mu4e/mu4e-draft
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-contrib hides /usr/share/emacs/site-lisp/mu4e/mu4e-contrib
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-context hides /usr/share/emacs/site-lisp/mu4e/mu4e-context
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-contacts hides /usr/share/emacs/site-lisp/mu4e/mu4e-contacts
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-config hides /usr/share/emacs/site-lisp/mu4e/mu4e-config
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-compose hides /usr/share/emacs/site-lisp/mu4e/mu4e-compose
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-bookmarks hides /usr/share/emacs/site-lisp/mu4e/mu4e-bookmarks
/home/azeem/.emacs.d/.local/straight/build-29.2/mu4e/mu4e-actions hides /usr/share/emacs/site-lisp/mu4e/mu4e-actions
/home/azeem/.emacs.d/.local/straight/build-29.2/transient/transient hides /usr/share/emacs/29.2/lisp/transient
/home/azeem/.emacs.d/.local/straight/build-29.2/ef-themes/theme-loaddefs hides /usr/share/emacs/29.2/lisp/theme-loaddefs
/home/azeem/.emacs.d/.local/straight/build-29.2/eww-hacks/shr hides /usr/share/emacs/29.2/lisp/net/shr
/home/azeem/.emacs.d/.local/straight/build-29.2/eww-hacks/eww hides /usr/share/emacs/29.2/lisp/net/eww

Features:
(evil-collection-proced proced shadow emacsbug descr-text consult-imenu
use-package-lint consult-flymake tabify files-x find-dired checkdoc
bicycle hideshow package-lint-flymake package-lint
evil-collection-finder finder finder-inf lisp-mnt
evil-collection-package-menu doom-packages package url-handlers
highlight-quoted rainbow-delimiters highlight-numbers parent-mode
hl-todo evil-collection-elisp-mode elisp-mode evil-collection-help
evil-collection-xref xref cl-print cus-start crm dired-x dirvish-emerge
dired-aux evil-embrace embrace expand-region text-mode-expansions
the-org-mode-expansions org-element org-persist xdg org-id org-refile
avl-tree generator er-basic-expansions expand-region-core
expand-region-custom evil-surround diredfl dirvish-subtree dirvish-icons
dirvish-widgets vc-hg evil-collection-vc-git vc-git vc-bzr vc-src
vc-sccs vc-svn vc-cvs vc-rcs evil-collection-log-view log-view pcvs-util
vc vc-dispatcher bug-reference image-mode exif evil-collection-indent
vertico-directory evil-collection-helpful helpful cc-langs cc-vars
cc-defs evil-collection-imenu imenu trace evil-collection-edebug edebug
evil-collection-debug debug backtrace info-look evil-collection-info
info f help-fns radix-tree evil-collection-elisp-refs elisp-refs s
mastodon-notifications evil-collection-view view password-store
auth-source-pass with-editor shell gts-engine-deepl gts-implements
gts-faces gts-core guess-language flyspell company-ispell
company-yasnippet company-dabbrev delsel display-line-numbers
adaptive-wrap jit-spell ispell face-remap recentf tree-widget saveplace
evil-collection-so-long so-long whitespace jka-compr link-hint ffap
goto-addr avy cursor-sensor vertico-repeat shr-color smerge-mode diff
evil-collection-diff-mode diff-mode mm-archive gnus-fun qp sort smiley
gnus-cite mail-extr gnus-async gnus-bcklg gnus-ml disp-table nndraft
nnmh epa-file gnus-agent gnus-srvr gnus-score score-mode nnvirtual
gnus-msg nntp gnus-cache hide-mode-line fabs evil-collection-consult
consult mastodon-media textsec uni-scripts idna-mapping ucs-normalize
uni-confusable textsec-check mastodon-profile mastodon-tl network-stream
url-http url-gw nsm url-cache url-auth mastodon-auth mastodon-client
plstore mastodon mastodon-search mastodon-toot facemenu mastodon-iso
persist mastodon-http request evil-collection-which-key which-key
savehist better-jumper company-capf company vertico-multiform
evil-collection-vertico vertico orderless nerd-icons-completion
marginalia evil-goggles pulse color evil-easymotion evil-escape
evil-snipe gcmh winner smartparens-config smartparens-text smartparens
loadhist dash ws-butler undo-fu-session undo-fu satchel ibuf-ext
evil-collection-ibuffer ibuffer ibuffer-loaddefs desktop frameset
evil-collection-mu4e mu4e mu4e-org evil-collection-org smartparens-org
org ob ob-tangle ob-ref ob-lob ob-table ob-exp org-macro org-src
ob-comint org-pcomplete pcomplete org-list org-footnote org-faces
org-entities noutline outline ob-emacs-lisp ob-core ob-eval org-cycle
org-table ol org-fold org-fold-core org-keys oc org-loaddefs find-func
org-version org-compat org-macs mu4e-notification notifications
mu4e-main mu4e-view gnus-art mm-uu mml2015 mm-view mml-smime smime
gnutls dig gnus-sum gnus-group gnus-undo gnus-start gnus-dbus dbus
autorevert filenotify gnus-cloud nnimap nnmail mail-source utf7 nnoo
parse-time iso8601 gnus-spec gnus-int gnus-range gnus-win
evil-collection-gnus gnus nnheader range evil-collection-calendar
cal-menu calendar cal-loaddefs mu4e-headers mu4e-compose mu4e-draft
mu4e-actions smtpmail mu4e-search mu4e-lists mu4e-bookmarks mu4e-mark
mu4e-message shr pixel-fill kinsoku url-file svg dom browse-url url
url-proxy url-privacy url-expand url-methods url-history url-cookie
generate-lisp-file url-domsuf url-util url-parse auth-source url-vars
flow-fill mule-util hl-line mu4e-contacts mu4e-update mu4e-folders
mu4e-context mu4e-query-items mu4e-server mu4e-modeline mu4e-vars
mu4e-helpers mu4e-config mu4e-window evil-collection-bookmark bookmark
ido message sendmail mailcap yank-media puny dirvish transient
format-spec eieio eieio-core compat evil-collection-dired dired
dired-loaddefs rfc822 mml mml-sec password-cache evil-collection-epa epa
epg rfc6068 epg-config gnus-util time-date mm-decode mm-bodies mm-encode
mail-parse rfc2231 rfc2047 rfc2045 mm-util ietf-drums mail-prsvr
mailabbrev mail-utils gmm-utils mailheader mu4e-obsolete server
dtrt-indent ef-spring-theme ef-themes pixel-scroll cua-base repeat
midnight html2text evil-collection-flymake flymake-proc flymake project
evil-collection-compile evil-collection-custom cus-edit cus-load
wid-edit evil-collection-comint evil-collection annalist compile
text-property-search comint ansi-osc ansi-color ibuf-macs evil
evil-integration evil-maps evil-commands reveal evil-jumps
evil-command-window evil-types evil-search evil-macros evil-repeat
evil-states evil-core advice evil-common thingatpt rect evil-vars ring
edmacro kmacro nerd-icons nerd-icons-faces nerd-icons-data
nerd-icons-data-mdicon nerd-icons-data-flicon nerd-icons-data-codicon
nerd-icons-data-devicon nerd-icons-data-sucicon nerd-icons-data-wicon
nerd-icons-data-faicon nerd-icons-data-powerline nerd-icons-data-octicon
nerd-icons-data-pomicon nerd-icons-data-ipsicon ligature derived comp
comp-cstr warnings icons rx doom-editor doom-projects doom-ui easy-mmode
doom-keybinds pp cl-extra help-mode use-package-core general tex-site
clang-rename clang-include-fixer let-alist json map byte-opt bytecomp
byte-compile clang-format xml doom-start :system doom-modules cl-seq
doom doom-lib cl-macs cl-loaddefs cl-lib gv harfbuzz jansson
dynamic-modules pcase subr-x rmc iso-transl tooltip cconv eldoc paren
electric uniquify ediff-hook vc-hooks lisp-float-type mwheel
term/pgtk-win pgtk-win term/common-win pgtk-dnd tool-bar dnd fontset
image regexp-opt fringe tabulated-list replace newcomment text-mode
lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch
easymenu timer select scroll-bar mouse jit-lock font-lock syntax
font-core term/tty-colors frame minibuffer nadvice seq simple cl-generic
indonesian philippine cham georgian utf-8-lang misc-lang vietnamese
tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek
romanian slovak czech european ethiopic indian cyrillic chinese
composite emoji-zwj charscript charprop case-table epa-hook
jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs
theme-loaddefs faces cus-face macroexp files window text-properties
overlay sha1 md5 base64 format env code-pages mule custom widget keymap
hashtable-print-readable backquote threads xwidget-internal dbusbind
inotify dynamic-setting system-font-setting font-render-setting cairo
gtk pgtk multi-tty make-network-process native-compile emacs)

Memory information:
((conses 16 1947280 182804)
 (symbols 48 88871 56)
 (strings 32 823936 14118)
 (string-bytes 1 19318565)
 (vectors 16 145143)
 (vector-slots 8 3823080 197541)
 (floats 8 2295 1214)
 (intervals 56 74905 6680)
 (buffers 984 584))




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#69785; Package emacs. (Thu, 21 Mar 2024 10:20:02 GMT) Full text and rfc822 format available.

Message #8 received at 69785 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Rahguzar <rahguzar <at> zohomail.eu>
Cc: 69785 <at> debbugs.gnu.org
Subject: Re: bug#69785: 29.2; Image mode can loop due to invalid images
Date: Thu, 21 Mar 2024 12:18:44 +0200
> Date: Wed, 13 Mar 2024 22:13:55 +0100
> From:  Rahguzar via "Bug reports for GNU Emacs,
>  the Swiss army knife of text editors" <bug-gnu-emacs <at> gnu.org>
> 
> 
> Dear Emacs developers,
> 
> Starting with emacs -Q, evaluate
> 
> (with-current-buffer (get-buffer-create "*image-mode-test*")
>   (insert (propertize "abc" 'display (list 'image "Definitely not an image.")))
>   (image-mode))
> 
> twice.
> 
> The second time results in an error and pop ups the debugger, with the
> following text,
> 
> Debugger entered--Lisp error: (excessive-lisp-nesting 1601)
>   display-images-p()
>   image-mode()
>   major-mode-restore((image-mode image-mode-as-text))
>   image-mode-to-text()
>   image-mode-as-text()
>   image-mode--display()
>   image-mode()
>   major-mode-restore((image-mode image-mode-as-text))
>   image-mode-to-text()
>   image-mode-as-text()
>   image-mode--display()
>   image-mode()
>   major-mode-restore((image-mode image-mode-as-text))
>   image-mode-to-text()
>   image-mode-as-text()
>   image-mode--display()
>   image-mode()
>   ...
> 
> It is unclear to me why this doesn't happen the first time but I think
> sequence causing it the second time is as follows:
> 
> 1. 'image-mode' calls 'major-mode-suspend' when 'major' mode is
> 'fundamental-mode'. So 'major-mode--suspended' is not set.
> 
> 2. 'image-mode--display' catches error and call 'image-mode-as-text'
> which calls 'image-mode-to-text'.
> 
> 3. 'image-mode-as-text' calls 'major-mode-restore' with '(image-mode
> image-mode-as-text) as mode to avoid.
> 
> 4. Since major-mode--suspended was not set in step 1
> 'major-mode-restore' falls back to 'normal-mode' which calls
> 'image-mode' causing the loop.
> 
> I think the simplest way of fixing this is to make sure that
> 'image-mode' doesn't call 'major-mode-suspend' with 'fundamental-mode'
> instead calling 'text-mode' or 'special-mode' before calling
> 'major-mode-suspend' if it starts in 'fundamental-mode'.

How about the patch below instead?

diff --git a/lisp/image-mode.el b/lisp/image-mode.el
index 355685e..fa64f1a 100644
--- a/lisp/image-mode.el
+++ b/lisp/image-mode.el
@@ -654,8 +654,9 @@ image-mode
   (unless (display-images-p)
     (error "Display does not support images"))
 
-  (major-mode-suspend)
-  (setq major-mode 'image-mode)
+  (unless (eq major-mode 'image-mode)
+    (major-mode-suspend)
+    (setq major-mode 'image-mode))
   (setq image-transform-resize image-auto-resize)
 
   ;; Bail out early if we have no image data.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#69785; Package emacs. (Fri, 22 Mar 2024 17:42:01 GMT) Full text and rfc822 format available.

Message #11 received at 69785 <at> debbugs.gnu.org (full text, mbox):

From: Rahguzar <rahguzar <at> zohomail.eu>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 69785 <at> debbugs.gnu.org
Subject: Re: bug#69785: 29.2; Image mode can loop due to invalid images
Date: Fri, 22 Mar 2024 18:24:09 +0100
Hi Eli,
   The patch fixes the problem.

Thanks,
Rahguzar

Eli Zaretskii <eliz <at> gnu.org> writes:

>> Date: Wed, 13 Mar 2024 22:13:55 +0100
>> From:  Rahguzar via "Bug reports for GNU Emacs,
>>  the Swiss army knife of text editors" <bug-gnu-emacs <at> gnu.org>
>>
>>
>> Dear Emacs developers,
>>
>> Starting with emacs -Q, evaluate
>>
>> (with-current-buffer (get-buffer-create "*image-mode-test*")
>>   (insert (propertize "abc" 'display (list 'image "Definitely not an image.")))
>>   (image-mode))
>>
>> twice.
>>
>> The second time results in an error and pop ups the debugger, with the
>> following text,
>>
>> Debugger entered--Lisp error: (excessive-lisp-nesting 1601)
>>   display-images-p()
>>   image-mode()
>>   major-mode-restore((image-mode image-mode-as-text))
>>   image-mode-to-text()
>>   image-mode-as-text()
>>   image-mode--display()
>>   image-mode()
>>   major-mode-restore((image-mode image-mode-as-text))
>>   image-mode-to-text()
>>   image-mode-as-text()
>>   image-mode--display()
>>   image-mode()
>>   major-mode-restore((image-mode image-mode-as-text))
>>   image-mode-to-text()
>>   image-mode-as-text()
>>   image-mode--display()
>>   image-mode()
>>   ...
>>
>> It is unclear to me why this doesn't happen the first time but I think
>> sequence causing it the second time is as follows:
>>
>> 1. 'image-mode' calls 'major-mode-suspend' when 'major' mode is
>> 'fundamental-mode'. So 'major-mode--suspended' is not set.
>>
>> 2. 'image-mode--display' catches error and call 'image-mode-as-text'
>> which calls 'image-mode-to-text'.
>>
>> 3. 'image-mode-as-text' calls 'major-mode-restore' with '(image-mode
>> image-mode-as-text) as mode to avoid.
>>
>> 4. Since major-mode--suspended was not set in step 1
>> 'major-mode-restore' falls back to 'normal-mode' which calls
>> 'image-mode' causing the loop.
>>
>> I think the simplest way of fixing this is to make sure that
>> 'image-mode' doesn't call 'major-mode-suspend' with 'fundamental-mode'
>> instead calling 'text-mode' or 'special-mode' before calling
>> 'major-mode-suspend' if it starts in 'fundamental-mode'.
>
> How about the patch below instead?
>
> diff --git a/lisp/image-mode.el b/lisp/image-mode.el
> index 355685e..fa64f1a 100644
> --- a/lisp/image-mode.el
> +++ b/lisp/image-mode.el
> @@ -654,8 +654,9 @@ image-mode
>    (unless (display-images-p)
>      (error "Display does not support images"))
>
> -  (major-mode-suspend)
> -  (setq major-mode 'image-mode)
> +  (unless (eq major-mode 'image-mode)
> +    (major-mode-suspend)
> +    (setq major-mode 'image-mode))
>    (setq image-transform-resize image-auto-resize)
>
>    ;; Bail out early if we have no image data.




Reply sent to Eli Zaretskii <eliz <at> gnu.org>:
You have taken responsibility. (Sat, 23 Mar 2024 07:55:02 GMT) Full text and rfc822 format available.

Notification sent to Rahguzar <rahguzar <at> zohomail.eu>:
bug acknowledged by developer. (Sat, 23 Mar 2024 07:55:02 GMT) Full text and rfc822 format available.

Message #16 received at 69785-done <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Rahguzar <rahguzar <at> zohomail.eu>
Cc: 69785-done <at> debbugs.gnu.org
Subject: Re: bug#69785: 29.2; Image mode can loop due to invalid images
Date: Sat, 23 Mar 2024 09:53:16 +0200
> From: Rahguzar <rahguzar <at> zohomail.eu>
> Cc: 69785 <at> debbugs.gnu.org
> Date: Fri, 22 Mar 2024 18:24:09 +0100
> 
> Hi Eli,
>    The patch fixes the problem.

Thanks, installed on master, and closing the bug.




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Sat, 20 Apr 2024 11:24:15 GMT) Full text and rfc822 format available.

This bug report was last modified 1 year and 120 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.