* bug#25391: 24.5; ffap-guesser "stack overflow in regexp matcher" error may crash emacs.
@ 2017-01-08 7:31 Thierry Volpiatto
2017-01-08 15:08 ` npostavs
0 siblings, 1 reply; 13+ messages in thread
From: Thierry Volpiatto @ 2017-01-08 7:31 UTC (permalink / raw)
To: 25391
Reproduce from emacs -Q:
1) require ffap.
2) Open a file of about 560k containing only one line, e.g
"~/emacs.d/elpa/archives/archive-contents"
3) M-: (ffap-guesser)
Debugger entered--Lisp error: (error "Variable binding depth exceeds max-specpdl-size")
looking-at("^.*\\<\\(Type\\|Name\\|Path\\|Host\\|Port\\) *= *\\(.*\\) *$")
ffap-gopher-at-point()
ffap-guesser()
eval((ffap-guesser) nil)
eval-expression((ffap-guesser) nil)
funcall-interactively(eval-expression (ffap-guesser) nil)
call-interactively(eval-expression nil nil)
command-execute(eval-expression)
This is reproductible from emacs-26 as well.
In GNU Emacs 24.5.1 (x86_64-unknown-linux-gnu, GTK+ Version 3.10.8)
of 2016-11-09 on dell-14z
Windowing system distributor `The X.Org Foundation', version 11.0.11701000
System Description: Linux Mint 17.3 Rosa
Configured using:
`configure CFLAGS=-O3'
Important settings:
value of $LC_MONETARY: fr_FR.UTF-8
value of $LC_NUMERIC: fr_FR.UTF-8
value of $LC_TIME: fr_FR.UTF-8
value of $LANG: fr_FR.UTF-8
locale-coding-system: utf-8-unix
Major mode: Lisp Interaction
Minor modes in effect:
global-disable-mouse-mode: t
global-git-gutter-mode: t
eldoc-in-minibuffer-mode: t
global-undo-tree-mode: t
undo-tree-mode: t
diff-auto-refine-mode: t
magit-auto-revert-mode: t
global-git-commit-mode: t
psession-mode: t
dired-async-mode: t
display-time-mode: t
winner-mode: t
auto-image-file-mode: t
savehist-mode: t
show-paren-mode: t
helm-descbinds-mode: t
helm-top-poll-mode: t
helm-push-mark-mode: t
eldoc-mode: t
helm-mode: t
shell-dirtrack-mode: t
helm-adaptive-mode: t
helm-popup-tip-mode: t
async-bytecomp-package-mode: t
minibuffer-depth-indicate-mode: t
override-global-mode: t
tooltip-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
column-number-mode: t
line-number-mode: t
transient-mark-mode: t
Recent messages:
uncompressing window.el.gz...done
Setting up indent for shell type bash
Indentation variables are now local.
Indentation setup for shell type bash
uncompressing reposition.el.gz...done
Restoring buffers...77%
Configuring package slime...done
Restoring buffers...82%
uncompressing imenu.el.gz...done
Restoring buffers...done
Load-path shadows:
/home/thierry/.emacs.d/elpa/org-20161224/ob-keys hides /usr/local/share/emacs/24.5/lisp/org/ob-keys
/home/thierry/.emacs.d/elpa/org-20161224/ob-ref hides /usr/local/share/emacs/24.5/lisp/org/ob-ref
/home/thierry/.emacs.d/elpa/org-20161224/ox-org hides /usr/local/share/emacs/24.5/lisp/org/ox-org
/home/thierry/.emacs.d/elpa/org-20161224/ob-sass hides /usr/local/share/emacs/24.5/lisp/org/ob-sass
/home/thierry/.emacs.d/elpa/org-20161224/org-bbdb hides /usr/local/share/emacs/24.5/lisp/org/org-bbdb
/home/thierry/.emacs.d/elpa/org-20161224/ox-latex hides /usr/local/share/emacs/24.5/lisp/org/ox-latex
/home/thierry/.emacs.d/elpa/org-20161224/ox-beamer hides /usr/local/share/emacs/24.5/lisp/org/ox-beamer
/home/thierry/.emacs.d/elpa/org-20161224/org-crypt hides /usr/local/share/emacs/24.5/lisp/org/org-crypt
/home/thierry/.emacs.d/elpa/org-20161224/ob-maxima hides /usr/local/share/emacs/24.5/lisp/org/ob-maxima
/home/thierry/.emacs.d/elpa/org-20161224/ob-R hides /usr/local/share/emacs/24.5/lisp/org/ob-R
/home/thierry/.emacs.d/elpa/org-20161224/ob-eval hides /usr/local/share/emacs/24.5/lisp/org/ob-eval
/home/thierry/.emacs.d/elpa/org-20161224/org-datetree hides /usr/local/share/emacs/24.5/lisp/org/org-datetree
/home/thierry/.emacs.d/elpa/org-20161224/org-element hides /usr/local/share/emacs/24.5/lisp/org/org-element
/home/thierry/.emacs.d/elpa/org-20161224/ob-core hides /usr/local/share/emacs/24.5/lisp/org/ob-core
/home/thierry/.emacs.d/elpa/org-20161224/ox-md hides /usr/local/share/emacs/24.5/lisp/org/ox-md
/home/thierry/.emacs.d/elpa/org-20161224/org-indent hides /usr/local/share/emacs/24.5/lisp/org/org-indent
/home/thierry/.emacs.d/elpa/org-20161224/ox hides /usr/local/share/emacs/24.5/lisp/org/ox
/home/thierry/.emacs.d/elpa/org-20161224/ob-fortran hides /usr/local/share/emacs/24.5/lisp/org/ob-fortran
/home/thierry/.emacs.d/elpa/org-20161224/ob-matlab hides /usr/local/share/emacs/24.5/lisp/org/ob-matlab
/home/thierry/.emacs.d/elpa/org-20161224/org-macro hides /usr/local/share/emacs/24.5/lisp/org/org-macro
/home/thierry/.emacs.d/elpa/org-20161224/ox-texinfo hides /usr/local/share/emacs/24.5/lisp/org/ox-texinfo
/home/thierry/.emacs.d/elpa/org-20161224/ob-sqlite hides /usr/local/share/emacs/24.5/lisp/org/ob-sqlite
/home/thierry/.emacs.d/elpa/org-20161224/org-faces hides /usr/local/share/emacs/24.5/lisp/org/org-faces
/home/thierry/.emacs.d/elpa/org-20161224/org-pcomplete hides /usr/local/share/emacs/24.5/lisp/org/org-pcomplete
/home/thierry/.emacs.d/elpa/org-20161224/org-mouse hides /usr/local/share/emacs/24.5/lisp/org/org-mouse
/home/thierry/.emacs.d/elpa/org-20161224/ob-emacs-lisp hides /usr/local/share/emacs/24.5/lisp/org/ob-emacs-lisp
/home/thierry/.emacs.d/elpa/org-20161224/org-archive hides /usr/local/share/emacs/24.5/lisp/org/org-archive
/home/thierry/.emacs.d/elpa/org-20161224/org-capture hides /usr/local/share/emacs/24.5/lisp/org/org-capture
/home/thierry/.emacs.d/elpa/org-20161224/ob-awk hides /usr/local/share/emacs/24.5/lisp/org/ob-awk
/home/thierry/.emacs.d/elpa/org-20161224/ob-octave hides /usr/local/share/emacs/24.5/lisp/org/ob-octave
/home/thierry/.emacs.d/elpa/org-20161224/org-timer hides /usr/local/share/emacs/24.5/lisp/org/org-timer
/home/thierry/.emacs.d/elpa/org-20161224/ob-sql hides /usr/local/share/emacs/24.5/lisp/org/ob-sql
/home/thierry/.emacs.d/elpa/org-20161224/ob-latex hides /usr/local/share/emacs/24.5/lisp/org/ob-latex
/home/thierry/.emacs.d/elpa/org-20161224/org-macs hides /usr/local/share/emacs/24.5/lisp/org/org-macs
/home/thierry/.emacs.d/elpa/org-20161224/org-rmail hides /usr/local/share/emacs/24.5/lisp/org/org-rmail
/home/thierry/.emacs.d/elpa/org-20161224/org-w3m hides /usr/local/share/emacs/24.5/lisp/org/org-w3m
/home/thierry/.emacs.d/elpa/org-20161224/ob-io hides /usr/local/share/emacs/24.5/lisp/org/ob-io
/home/thierry/.emacs.d/elpa/org-20161224/ob hides /usr/local/share/emacs/24.5/lisp/org/ob
/home/thierry/.emacs.d/elpa/org-20161224/ob-perl hides /usr/local/share/emacs/24.5/lisp/org/ob-perl
/home/thierry/.emacs.d/elpa/org-20161224/ob-mscgen hides /usr/local/share/emacs/24.5/lisp/org/ob-mscgen
/home/thierry/.emacs.d/elpa/org-20161224/ob-lilypond hides /usr/local/share/emacs/24.5/lisp/org/ob-lilypond
/home/thierry/.emacs.d/elpa/org-20161224/org-footnote hides /usr/local/share/emacs/24.5/lisp/org/org-footnote
/home/thierry/.emacs.d/elpa/org-20161224/ob-java hides /usr/local/share/emacs/24.5/lisp/org/ob-java
/home/thierry/.emacs.d/elpa/org-20161224/ox-html hides /usr/local/share/emacs/24.5/lisp/org/ox-html
/home/thierry/.emacs.d/elpa/org-20161224/ob-haskell hides /usr/local/share/emacs/24.5/lisp/org/ob-haskell
/home/thierry/.emacs.d/elpa/org-20161224/org-docview hides /usr/local/share/emacs/24.5/lisp/org/org-docview
/home/thierry/.emacs.d/elpa/org-20161224/ob-comint hides /usr/local/share/emacs/24.5/lisp/org/ob-comint
/home/thierry/.emacs.d/elpa/org-20161224/ob-css hides /usr/local/share/emacs/24.5/lisp/org/ob-css
/home/thierry/.emacs.d/elpa/org-20161224/ob-ditaa hides /usr/local/share/emacs/24.5/lisp/org/ob-ditaa
/home/thierry/.emacs.d/elpa/org-20161224/ob-scala hides /usr/local/share/emacs/24.5/lisp/org/ob-scala
/home/thierry/.emacs.d/elpa/org-20161224/org hides /usr/local/share/emacs/24.5/lisp/org/org
/home/thierry/.emacs.d/elpa/org-20161224/org-mobile hides /usr/local/share/emacs/24.5/lisp/org/org-mobile
/home/thierry/.emacs.d/elpa/org-20161224/ob-lisp hides /usr/local/share/emacs/24.5/lisp/org/ob-lisp
/home/thierry/.emacs.d/elpa/org-20161224/ob-gnuplot hides /usr/local/share/emacs/24.5/lisp/org/ob-gnuplot
/home/thierry/.emacs.d/elpa/org-20161224/org-src hides /usr/local/share/emacs/24.5/lisp/org/org-src
/home/thierry/.emacs.d/elpa/org-20161224/ox-ascii hides /usr/local/share/emacs/24.5/lisp/org/ox-ascii
/home/thierry/.emacs.d/elpa/org-20161224/ob-calc hides /usr/local/share/emacs/24.5/lisp/org/ob-calc
/home/thierry/.emacs.d/elpa/org-20161224/org-irc hides /usr/local/share/emacs/24.5/lisp/org/org-irc
/home/thierry/.emacs.d/elpa/org-20161224/org-loaddefs hides /usr/local/share/emacs/24.5/lisp/org/org-loaddefs
/home/thierry/.emacs.d/elpa/org-20161224/org-install hides /usr/local/share/emacs/24.5/lisp/org/org-install
/home/thierry/.emacs.d/elpa/org-20161224/org-info hides /usr/local/share/emacs/24.5/lisp/org/org-info
/home/thierry/.emacs.d/elpa/org-20161224/ob-plantuml hides /usr/local/share/emacs/24.5/lisp/org/ob-plantuml
/home/thierry/.emacs.d/elpa/org-20161224/org-feed hides /usr/local/share/emacs/24.5/lisp/org/org-feed
/home/thierry/.emacs.d/elpa/org-20161224/org-version hides /usr/local/share/emacs/24.5/lisp/org/org-version
/home/thierry/.emacs.d/elpa/org-20161224/ob-makefile hides /usr/local/share/emacs/24.5/lisp/org/ob-makefile
/home/thierry/.emacs.d/elpa/org-20161224/org-entities hides /usr/local/share/emacs/24.5/lisp/org/org-entities
/home/thierry/.emacs.d/elpa/org-20161224/ob-python hides /usr/local/share/emacs/24.5/lisp/org/ob-python
/home/thierry/.emacs.d/elpa/org-20161224/ob-ledger hides /usr/local/share/emacs/24.5/lisp/org/ob-ledger
/home/thierry/.emacs.d/elpa/org-20161224/ox-man hides /usr/local/share/emacs/24.5/lisp/org/ox-man
/home/thierry/.emacs.d/elpa/org-20161224/ob-shen hides /usr/local/share/emacs/24.5/lisp/org/ob-shen
/home/thierry/.emacs.d/elpa/org-20161224/org-inlinetask hides /usr/local/share/emacs/24.5/lisp/org/org-inlinetask
/home/thierry/.emacs.d/elpa/org-20161224/org-list hides /usr/local/share/emacs/24.5/lisp/org/org-list
/home/thierry/.emacs.d/elpa/org-20161224/ox-publish hides /usr/local/share/emacs/24.5/lisp/org/ox-publish
/home/thierry/.emacs.d/elpa/org-20161224/org-gnus hides /usr/local/share/emacs/24.5/lisp/org/org-gnus
/home/thierry/.emacs.d/elpa/org-20161224/org-agenda hides /usr/local/share/emacs/24.5/lisp/org/org-agenda
/home/thierry/.emacs.d/elpa/org-20161224/org-id hides /usr/local/share/emacs/24.5/lisp/org/org-id
/home/thierry/.emacs.d/elpa/org-20161224/org-plot hides /usr/local/share/emacs/24.5/lisp/org/org-plot
/home/thierry/.emacs.d/elpa/org-20161224/ob-C hides /usr/local/share/emacs/24.5/lisp/org/ob-C
/home/thierry/.emacs.d/elpa/org-20161224/org-clock hides /usr/local/share/emacs/24.5/lisp/org/org-clock
/home/thierry/.emacs.d/elpa/org-20161224/org-attach hides /usr/local/share/emacs/24.5/lisp/org/org-attach
/home/thierry/.emacs.d/elpa/org-20161224/ob-ruby hides /usr/local/share/emacs/24.5/lisp/org/ob-ruby
/home/thierry/.emacs.d/elpa/org-20161224/org-habit hides /usr/local/share/emacs/24.5/lisp/org/org-habit
/home/thierry/.emacs.d/elpa/org-20161224/org-eshell hides /usr/local/share/emacs/24.5/lisp/org/org-eshell
/home/thierry/.emacs.d/elpa/org-20161224/ob-ocaml hides /usr/local/share/emacs/24.5/lisp/org/ob-ocaml
/home/thierry/.emacs.d/elpa/org-20161224/ox-odt hides /usr/local/share/emacs/24.5/lisp/org/ox-odt
/home/thierry/.emacs.d/elpa/org-20161224/ob-exp hides /usr/local/share/emacs/24.5/lisp/org/ob-exp
/home/thierry/.emacs.d/elpa/org-20161224/ob-dot hides /usr/local/share/emacs/24.5/lisp/org/ob-dot
/home/thierry/.emacs.d/elpa/org-20161224/ob-scheme hides /usr/local/share/emacs/24.5/lisp/org/ob-scheme
/home/thierry/.emacs.d/elpa/org-20161224/ob-org hides /usr/local/share/emacs/24.5/lisp/org/ob-org
/home/thierry/.emacs.d/elpa/org-20161224/org-bibtex hides /usr/local/share/emacs/24.5/lisp/org/org-bibtex
/home/thierry/.emacs.d/elpa/org-20161224/org-compat hides /usr/local/share/emacs/24.5/lisp/org/org-compat
/home/thierry/.emacs.d/elpa/org-20161224/ox-icalendar hides /usr/local/share/emacs/24.5/lisp/org/ox-icalendar
/home/thierry/.emacs.d/elpa/org-20161224/org-colview hides /usr/local/share/emacs/24.5/lisp/org/org-colview
/home/thierry/.emacs.d/elpa/org-20161224/ob-picolisp hides /usr/local/share/emacs/24.5/lisp/org/ob-picolisp
/home/thierry/.emacs.d/elpa/org-20161224/org-mhe hides /usr/local/share/emacs/24.5/lisp/org/org-mhe
/home/thierry/.emacs.d/elpa/org-20161224/org-table hides /usr/local/share/emacs/24.5/lisp/org/org-table
/home/thierry/.emacs.d/elpa/org-20161224/ob-clojure hides /usr/local/share/emacs/24.5/lisp/org/ob-clojure
/home/thierry/.emacs.d/elpa/org-20161224/ob-tangle hides /usr/local/share/emacs/24.5/lisp/org/ob-tangle
/home/thierry/.emacs.d/elpa/org-20161224/ob-table hides /usr/local/share/emacs/24.5/lisp/org/ob-table
/home/thierry/.emacs.d/elpa/org-20161224/ob-asymptote hides /usr/local/share/emacs/24.5/lisp/org/ob-asymptote
/home/thierry/.emacs.d/elpa/org-20161224/org-ctags hides /usr/local/share/emacs/24.5/lisp/org/org-ctags
/home/thierry/.emacs.d/elpa/org-20161224/ob-screen hides /usr/local/share/emacs/24.5/lisp/org/ob-screen
/home/thierry/.emacs.d/elpa/org-20161224/org-protocol hides /usr/local/share/emacs/24.5/lisp/org/org-protocol
/home/thierry/.emacs.d/elpa/org-20161224/ob-js hides /usr/local/share/emacs/24.5/lisp/org/ob-js
/home/thierry/.emacs.d/elpa/org-20161224/ob-lob hides /usr/local/share/emacs/24.5/lisp/org/ob-lob
/home/thierry/.emacs.d/elpa/soap-client-3.1.1/soap-client hides /usr/local/share/emacs/24.5/lisp/net/soap-client
/home/thierry/.emacs.d/elpa/soap-client-3.1.1/soap-inspect hides /usr/local/share/emacs/24.5/lisp/net/soap-inspect
Features:
(shadow epa-mail face-remap emacsbug helm-command js imenu
slime-xref-browser tree-widget slime-banner slime-tramp slime-asdf
slime-fancy slime-trace-dialog slime-fontifying-fu slime-package-fu
slime-references slime-compiler-notes-tree slime-scratch
slime-presentations bridge slime-macrostep slime-mdot-fu
slime-enclosing-context slime-fuzzy slime-fancy-trace
slime-fancy-inspector slime-c-p-c slime-editing-commands slime-autodoc
slime-repl slime-parse slime etags arc-mode archive-mode hyperspec
make-mode cc-awk conf-mode macrostep-c subr-x cmacexp macrostep cc-langs
cc-mode cc-fonts cc-guess cc-menus cc-cmds cc-styles cc-align cc-engine
cc-vars cc-defs vc-rcs ledger-config ledger vc-git naquadah-theme view
mule-util solar cal-dst holidays hol-loaddefs em-unix em-term term
disp-table ehelp em-script em-prompt em-ls em-hist em-pred em-glob
em-dirs em-cmpl em-basic em-banner em-alias tv-utils gh gh-users
gh-issues gh-pulls gh-repos gh-comments gh-gist gh-oauth gh-api logito
gh-cache pcache eieio-base gh-auth gh-url url-http tls url-auth url-gw
disable-mouse powerline powerline-separators color powerline-themes
windmove benchmark-init toc-org ert ewoc debug elp cl-indent esh-var
esh-io esh-cmd esh-opt esh-ext esh-proc esh-arg esh-groups eshell
esh-module esh-mode esh-util markdown-mode addressbook-bookmark
mu4e-config org-mu4e helm-mu mu4e-contrib mu4e desktop frameset
mu4e-speedbar speedbar sb-image ezimage dframe mu4e-main mu4e-context
mu4e-view epa derived epg mu4e-headers mu4e-compose mu4e-draft
mu4e-actions ido rfc2368 smtpmail sendmail mu4e-mark mu4e-message
html2text mu4e-proc mu4e-utils mu4e-lists mu4e-vars hl-line cl mu4e-meta
config-w3m w3m-search w3m doc-view jka-compr image-mode timezone
w3m-hist w3m-fb bookmark-w3m w3m-ems w3m-ccl ccl w3m-favicon w3m-image
w3m-proc w3m-util git-gutter cus-edit wid-edit appt diary-lib
diary-loaddefs ange-ftp xdvi-search eldoc-eval undo-tree diff
magit-obsolete magit-blame magit-stash magit-bisect magit-remote
magit-commit magit-sequence magit-notes magit-worktree magit-branch
magit-files magit-refs magit-status magit magit-repos magit-apply
magit-wip magit-log magit-diff smerge-mode diff-mode magit-core
magit-autorevert autorevert filenotify magit-process magit-margin
magit-mode help-mode magit-git crm magit-section magit-popup git-commit
magit-utils log-edit message rfc822 mml mml-sec mm-decode mm-bodies
mm-encode mail-parse rfc2231 rfc2047 rfc2045 ietf-drums mailabbrev
mail-utils gmm-utils mailheader pcvs-util add-log with-editor tramp-sh
server pcomplete-extension pcmpl-unix pcmpl-gnu psession iterator iedit
iedit-lib dired-extension org-config-thierry ob-sh org-crypt org-element
avl-tree org-location-google-maps org-agenda google-maps
google-maps-static google-maps-geocode google-maps-base org org-macro
org-footnote org-pcomplete org-list org-faces org-entities noutline
outline org-version ob-emacs-lisp ob ob-tangle org-src ob-ref ob-lob
ob-table ob-keys ob-exp ob-comint ob-core ob-eval org-compat org-macs
org-loaddefs find-func cal-menu calendar cal-loaddefs dired-async
net-utils time winner w3m-wget wget wget-sysdep cmake-mode autotest-mode
autoconf-mode sh-script smie executable ps-print ps-def lpr rst
image-file savehist paren woman man ediff-merg ediff-wind ediff-diff
ediff-mult ediff-help ediff-init ediff-util ediff init-helm-thierry
helm-descbinds helm-sys popup helm-ring helm-elisp helm-eval edebug
eldoc helm-mode helm-files image-dired tramp tramp-compat tramp-loaddefs
trampver shell pcomplete format-spec dired-x dired-aux ffap thingatpt
helm-buffers helm-elscreen helm-tags helm-bookmark helm-adaptive
helm-info bookmark pp helm-locate helm-grep wgrep-helm wgrep grep
helm-regexp helm-external helm-net browse-url xml url url-proxy
url-privacy url-expand url-methods url-history url-cookie url-domsuf
url-util mailcap helm-utils compile comint ansi-color ring helm-help
helm-types helm helm-source helm-multi-match helm-lib dired
helm-extensions-autoloads helm-config helm-autoloads helm-easymenu
cl-macs gv async-bytecomp advice async mb-depth edmacro kmacro
use-package diminish bind-key easy-mmode tex-site gh-common gh-profile
url-parse auth-source gnus-util mm-util help-fns mail-prsvr
password-cache url-vars rx s ucs-normalize marshal ht json dash eieio
byte-opt bytecomp byte-compile cl-extra cconv eieio-core slime-autoloads
info easymenu package epg-config time-date avoid cus-start cus-load
cl-loaddefs cl-lib tooltip electric uniquify ediff-hook vc-hooks
lisp-float-type mwheel x-win x-dnd tool-bar dnd fontset image regexp-opt
fringe tabulated-list newcomment lisp-mode prog-mode register page
menu-bar rfn-eshadow timer select scroll-bar mouse jit-lock font-lock
syntax facemenu font-core frame cham georgian utf-8-lang misc-lang
vietnamese tibetan thai tai-viet lao korean japanese hebrew greek
romanian slovak czech european ethiopic indian cyrillic chinese
case-table epa-hook jka-cmpr-hook help simple abbrev minibuffer nadvice
loaddefs button faces cus-face macroexp files text-properties overlay
sha1 md5 base64 format env code-pages mule custom widget
hashtable-print-readable backquote make-network-process dbusbind
gfilenotify dynamic-setting system-font-setting font-render-setting
move-toolbar gtk x-toolkit x multi-tty emacs)
Memory information:
((conses 16 785234 224980)
(symbols 48 66492 2)
(miscs 40 369 2735)
(strings 32 189134 114480)
(string-bytes 1 5580098)
(vectors 16 88824)
(vector-slots 8 1295163 62942)
(floats 8 2470 841)
(intervals 56 2763 783)
(buffers 960 162)
(heap 1024 88807 14786))
--
Thierry
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#25391: 24.5; ffap-guesser "stack overflow in regexp matcher" error may crash emacs.
2017-01-08 7:31 bug#25391: 24.5; ffap-guesser "stack overflow in regexp matcher" error may crash emacs Thierry Volpiatto
@ 2017-01-08 15:08 ` npostavs
2017-01-08 17:28 ` Thierry Volpiatto
0 siblings, 1 reply; 13+ messages in thread
From: npostavs @ 2017-01-08 15:08 UTC (permalink / raw)
To: Thierry Volpiatto; +Cc: 25391
Thierry Volpiatto <thierry.volpiatto@gmail.com> writes:
> Reproduce from emacs -Q:
>
> 1) require ffap.
> 2) Open a file of about 560k containing only one line, e.g
> "~/emacs.d/elpa/archives/archive-contents"
> 3) M-: (ffap-guesser)
>
> Debugger entered--Lisp error: (error "Variable binding depth exceeds max-specpdl-size")
> looking-at("^.*\\<\\(Type\\|Name\\|Path\\|Host\\|Port\\) *= *\\(.*\\) *$")
[...]
>
> This is reproductible from emacs-26 as well.
The max-specpdl-size error looks like #24751 (I was planning to push the
patch for that today), but as far as I know, that's only in emacs-26.
emacs-25 and earlier correctly throw "stack overflow in regexp matcher".
Unless you have REL_ALLOC enabled (which is the default for GNU/Linux
distributions with the latest glibc), in which case any buffer search
may crash emacs instead. That's #24358, occurs in 25.1 (and probably
earlier), but it's already fixed in the emacs-25 branch. Also fixable
by configuring with REL_ALLOC=no.
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#25391: 24.5; ffap-guesser "stack overflow in regexp matcher" error may crash emacs.
2017-01-08 15:08 ` npostavs
@ 2017-01-08 17:28 ` Thierry Volpiatto
2017-01-08 23:29 ` npostavs
0 siblings, 1 reply; 13+ messages in thread
From: Thierry Volpiatto @ 2017-01-08 17:28 UTC (permalink / raw)
To: npostavs; +Cc: 25391
npostavs@users.sourceforge.net writes:
> Thierry Volpiatto <thierry.volpiatto@gmail.com> writes:
>
>> Reproduce from emacs -Q:
>>
>> 1) require ffap.
>> 2) Open a file of about 560k containing only one line, e.g
>> "~/emacs.d/elpa/archives/archive-contents"
>> 3) M-: (ffap-guesser)
>>
>> Debugger entered--Lisp error: (error "Variable binding depth exceeds max-specpdl-size")
>> looking-at("^.*\\<\\(Type\\|Name\\|Path\\|Host\\|Port\\) *= *\\(.*\\) *$")
> [...]
>>
>> This is reproductible from emacs-26 as well.
>
> The max-specpdl-size error looks like #24751 (I was planning to push the
> patch for that today), but as far as I know, that's only in emacs-26.
> emacs-25 and earlier correctly throw "stack overflow in regexp matcher".
> Unless you have REL_ALLOC enabled (which is the default for GNU/Linux
> distributions with the latest glibc), in which case any buffer search
> may crash emacs instead. That's #24358, occurs in 25.1 (and probably
> earlier), but it's already fixed in the emacs-25 branch. Also fixable
> by configuring with REL_ALLOC=no.
Good to know thanks.
However, this handle the problem with "Stack overflow in regexp matcher"
generally, but perhaps regexps such as `ffap-gopher-regexp` could be
avoided when possible in emacs source code.
IIUC regexps like "^.*\\(this\\|that etc...\\)" create an incredible
number of travels between bol and eol (which may sometimes be eob) and
lead to a stack overflow inevitably on long lines (perhaps not so long
in this case).
Thanks.
--
Thierry
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#25391: 24.5; ffap-guesser "stack overflow in regexp matcher" error may crash emacs.
2017-01-08 17:28 ` Thierry Volpiatto
@ 2017-01-08 23:29 ` npostavs
2017-01-09 7:00 ` Thierry Volpiatto
0 siblings, 1 reply; 13+ messages in thread
From: npostavs @ 2017-01-08 23:29 UTC (permalink / raw)
To: Thierry Volpiatto; +Cc: 25391
[-- Attachment #1: Type: text/plain, Size: 652 bytes --]
tags 25391 patch
quit
Thierry Volpiatto <thierry.volpiatto@gmail.com> writes:
>
> However, this handle the problem with "Stack overflow in regexp matcher"
> generally, but perhaps regexps such as `ffap-gopher-regexp` could be
> avoided when possible in emacs source code.
Ah, so by "crash" you meant throw an error.
>
> IIUC regexps like "^.*\\(this\\|that etc...\\)" create an incredible
> number of travels between bol and eol (which may sometimes be eob) and
> lead to a stack overflow inevitably on long lines (perhaps not so long
> in this case).
Right, and ffap-gopher-at-point is also using `set' on local variables,
icky. Here's a patch:
[-- Attachment #2: patch --]
[-- Type: text/plain, Size: 4854 bytes --]
From 589054b197ab4a9778454efd0192bdd45ce38518 Mon Sep 17 00:00:00 2001
From: Noam Postavsky <npostavs@gmail.com>
Date: Sun, 8 Jan 2017 18:19:32 -0500
Subject: [PATCH v1] Improve ffap-gopher-at-point handling of long lines
* lisp/ffap.el (ffap-gopher-regexp): Remove.
(ffap--gopher-var-on-line): New function.
(ffap-gopher-at-point): Use it instead of ffap-gopher-regexp which could
overflow the regexp stack on long lines (Bug#25391). Use `let-alist'
instead of calling `set' on local variables.
* test/lisp/ffap-tests.el (ffap-gopher-at-point): New test.
---
lisp/ffap.el | 61 ++++++++++++++++++++++++-------------------------
test/lisp/ffap-tests.el | 15 ++++++++++++
2 files changed, 45 insertions(+), 31 deletions(-)
diff --git a/lisp/ffap.el b/lisp/ffap.el
index 8144d41..1ef2b10 100644
--- a/lisp/ffap.el
+++ b/lisp/ffap.el
@@ -1193,10 +1193,17 @@ ffap-url-at-point
(list (car bounds) (cdr bounds)))))
val))))
-(defvar ffap-gopher-regexp
- "^.*\\<\\(Type\\|Name\\|Path\\|Host\\|Port\\) *= *\\(.*\\) *$"
- "Regexp matching a line in a gopher bookmark (maybe indented).
-The two subexpressions are the KEY and VALUE.")
+(defun ffap--gopher-var-on-line ()
+ "Return (KEY . VALUE) of gopher bookmark on current line."
+ (save-excursion
+ (let ((bol (progn (beginning-of-line) (point)))
+ (eol (progn (end-of-line) (skip-chars-backward " ") (point))))
+ (goto-char bol)
+ (when (re-search-forward
+ "\\<\\(Type\\|Name\\|Path\\|Host\\|Port\\) *= *" eol t)
+ (let ((key (match-string 1))
+ (val (buffer-substring-no-properties (match-end 0) eol)))
+ (cons (intern (downcase key)) val))))))
(defun ffap-gopher-at-point ()
"If point is inside a gopher bookmark block, return its URL.
@@ -1204,33 +1211,25 @@ ffap-gopher-at-point
Sets the variable `ffap-string-at-point-region' to the bounds of URL, if any."
;; `gopher-parse-bookmark' from gopher.el is not so robust
(save-excursion
- (beginning-of-line)
- (if (looking-at ffap-gopher-regexp)
- (progn
- (while (and (looking-at ffap-gopher-regexp) (not (bobp)))
- (forward-line -1))
- (or (looking-at ffap-gopher-regexp) (forward-line 1))
- (setq ffap-string-at-point-region (list (point) (point)))
- (let ((type "1") path host (port "70"))
- (while (looking-at ffap-gopher-regexp)
- (let ((var (intern
- (downcase
- (buffer-substring (match-beginning 1)
- (match-end 1)))))
- (val (buffer-substring (match-beginning 2)
- (match-end 2))))
- (set var val)
- (forward-line 1)))
- (setcdr ffap-string-at-point-region (list (point)))
- (if (and path (string-match "^ftp:.*@" path))
- (concat "ftp://"
- (substring path 4 (1- (match-end 0)))
- (substring path (match-end 0)))
- (and (= (length type) 1)
- host;; (ffap-machine-p host)
- (concat "gopher://" host
- (if (equal port "70") "" (concat ":" port))
- "/" type path))))))))
+ (let* ((beg (progn (beginning-of-line)
+ (while (and (not (bobp)) (ffap--gopher-var-on-line))
+ (forward-line -1))
+ (point)))
+ (bookmark (cl-loop for keyval = (ffap--gopher-var-on-line)
+ while keyval collect keyval
+ do (forward-line 1))))
+ (when bookmark
+ (setq ffap-string-at-point-region (list beg (point)))
+ (let-alist (nconc bookmark '((type . "1") (port . "70")))
+ (if (and .path (string-match "\\`ftp:.*@" .path))
+ (concat "ftp://"
+ (substring .path 4 (1- (match-end 0)))
+ (substring .path (match-end 0)))
+ (and (= (length .type) 1)
+ .host ;; (ffap-machine-p host)
+ (concat "gopher://" .host
+ (if (equal .port "70") "" (concat ":" .port))
+ "/" .type .path))))))))
(defvar ffap-ftp-sans-slash-regexp
(and
diff --git a/test/lisp/ffap-tests.el b/test/lisp/ffap-tests.el
index 1ba5f86..f3414ac 100644
--- a/test/lisp/ffap-tests.el
+++ b/test/lisp/ffap-tests.el
@@ -49,6 +49,21 @@
(should (equal '(1 1) ffap-string-at-point-region)))))
(and (file-exists-p file) (delete-file file)))))
+(ert-deftest ffap-gopher-at-point ()
+ (with-temp-buffer
+ (insert "\
+Type = 1
+Name = foo
+Path = /the/path
+Port = 7070
+Host = example.com\n")
+ (should-not (ffap-gopher-at-point))
+ (goto-char (point-min))
+ (should (equal (ffap-gopher-at-point)
+ "gopher://example.com:7070/1/the/path"))
+ (should (equal ffap-string-at-point-region
+ (list (point-min) (point-max))))))
+
(provide 'ffap-tests)
;;; ffap-tests.el ends here
--
2.9.3
^ permalink raw reply related [flat|nested] 13+ messages in thread
* bug#25391: 24.5; ffap-guesser "stack overflow in regexp matcher" error may crash emacs.
2017-01-08 23:29 ` npostavs
@ 2017-01-09 7:00 ` Thierry Volpiatto
2017-01-10 4:37 ` npostavs
0 siblings, 1 reply; 13+ messages in thread
From: Thierry Volpiatto @ 2017-01-09 7:00 UTC (permalink / raw)
To: npostavs; +Cc: 25391
npostavs@users.sourceforge.net writes:
> tags 25391 patch
> quit
>
> Thierry Volpiatto <thierry.volpiatto@gmail.com> writes:
>>
>> However, this handle the problem with "Stack overflow in regexp matcher"
>> generally, but perhaps regexps such as `ffap-gopher-regexp` could be
>> avoided when possible in emacs source code.
>
> Ah, so by "crash" you meant throw an error.
I had the both, a crash on emacs-26, emacs taking all memory and finally
crashing and on emacs-24.5 "Stack overflow in regexp matcher".
> Right, and ffap-gopher-at-point is also using `set' on local variables,
> icky. Here's a patch:
I don't know `let-alist`, but looks good, however keeping
`ffap-gopher-regexp` instead of hardcoding it and returning nil when the
regexp is nil would allow users to disable the feature.
Thanks.
--
Thierry
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#25391: 24.5; ffap-guesser "stack overflow in regexp matcher" error may crash emacs.
2017-01-09 7:00 ` Thierry Volpiatto
@ 2017-01-10 4:37 ` npostavs
2017-01-10 7:17 ` Thierry Volpiatto
0 siblings, 1 reply; 13+ messages in thread
From: npostavs @ 2017-01-10 4:37 UTC (permalink / raw)
To: Thierry Volpiatto; +Cc: 25391
[-- Attachment #1: Type: text/plain, Size: 970 bytes --]
Thierry Volpiatto <thierry.volpiatto@gmail.com> writes:
>>
>> Thierry Volpiatto <thierry.volpiatto@gmail.com> writes:
>>>
>>> However, this handle the problem with "Stack overflow in regexp matcher"
>>> generally, but perhaps regexps such as `ffap-gopher-regexp` could be
>>> avoided when possible in emacs source code.
>>
>> Ah, so by "crash" you meant throw an error.
>
> I had the both, a crash on emacs-26, emacs taking all memory and finally
> crashing and on emacs-24.5 "Stack overflow in regexp matcher".
Hmm, well I've meanwhile merged the fix for the regex stack limit, if
you can still crash emacs this way, open a new bug.
>
>
>> Right, and ffap-gopher-at-point is also using `set' on local variables,
>> icky. Here's a patch:
>
> I don't know `let-alist`, but looks good, however keeping
> `ffap-gopher-regexp` instead of hardcoding it and returning nil when the
> regexp is nil would allow users to disable the feature.
Makes sense, here's an update:
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: patch --]
[-- Type: text/x-diff, Size: 4858 bytes --]
From 93875e1d9dba4509ddd18ade9b09bf6b258d2174 Mon Sep 17 00:00:00 2001
From: Noam Postavsky <npostavs@gmail.com>
Date: Sun, 8 Jan 2017 18:19:32 -0500
Subject: [PATCH v2] Improve ffap-gopher-at-point handling of long lines
* lisp/ffap.el (ffap-gopher-regexp): Only match the KEY part.
(ffap--gopher-var-on-line): New function.
(ffap-gopher-at-point): Use it instead of the old ffap-gopher-regexp
which could overflow the regexp stack on long lines (Bug#25391). Use
`let-alist' instead of calling `set' on local variables.
* test/lisp/ffap-tests.el (ffap-gopher-at-point): New test.
---
lisp/ffap.el | 61 +++++++++++++++++++++++++------------------------
test/lisp/ffap-tests.el | 15 ++++++++++++
2 files changed, 46 insertions(+), 30 deletions(-)
diff --git a/lisp/ffap.el b/lisp/ffap.el
index 8144d41..bcc8911 100644
--- a/lisp/ffap.el
+++ b/lisp/ffap.el
@@ -1194,9 +1194,18 @@ ffap-url-at-point
val))))
(defvar ffap-gopher-regexp
- "^.*\\<\\(Type\\|Name\\|Path\\|Host\\|Port\\) *= *\\(.*\\) *$"
- "Regexp matching a line in a gopher bookmark (maybe indented).
-The two subexpressions are the KEY and VALUE.")
+ "\\<\\(Type\\|Name\\|Path\\|Host\\|Port\\) *= *"
+ "Regexp matching a key in a gopher bookmark.")
+
+(defun ffap--gopher-var-on-line ()
+ "Return (KEY . VALUE) of gopher bookmark on current line."
+ (save-excursion
+ (let ((eol (progn (end-of-line) (skip-chars-backward " ") (point)))
+ (bol (progn (beginning-of-line) (point))))
+ (when (re-search-forward ffap-gopher-regexp eol t)
+ (let ((key (match-string 1))
+ (val (buffer-substring-no-properties (match-end 0) eol)))
+ (cons (intern (downcase key)) val))))))
(defun ffap-gopher-at-point ()
"If point is inside a gopher bookmark block, return its URL.
@@ -1204,33 +1213,25 @@ ffap-gopher-at-point
Sets the variable `ffap-string-at-point-region' to the bounds of URL, if any."
;; `gopher-parse-bookmark' from gopher.el is not so robust
(save-excursion
- (beginning-of-line)
- (if (looking-at ffap-gopher-regexp)
- (progn
- (while (and (looking-at ffap-gopher-regexp) (not (bobp)))
- (forward-line -1))
- (or (looking-at ffap-gopher-regexp) (forward-line 1))
- (setq ffap-string-at-point-region (list (point) (point)))
- (let ((type "1") path host (port "70"))
- (while (looking-at ffap-gopher-regexp)
- (let ((var (intern
- (downcase
- (buffer-substring (match-beginning 1)
- (match-end 1)))))
- (val (buffer-substring (match-beginning 2)
- (match-end 2))))
- (set var val)
- (forward-line 1)))
- (setcdr ffap-string-at-point-region (list (point)))
- (if (and path (string-match "^ftp:.*@" path))
- (concat "ftp://"
- (substring path 4 (1- (match-end 0)))
- (substring path (match-end 0)))
- (and (= (length type) 1)
- host;; (ffap-machine-p host)
- (concat "gopher://" host
- (if (equal port "70") "" (concat ":" port))
- "/" type path))))))))
+ (let* ((beg (progn (beginning-of-line)
+ (while (and (not (bobp)) (ffap--gopher-var-on-line))
+ (forward-line -1))
+ (point)))
+ (bookmark (cl-loop for keyval = (ffap--gopher-var-on-line)
+ while keyval collect keyval
+ do (forward-line 1))))
+ (when bookmark
+ (setq ffap-string-at-point-region (list beg (point)))
+ (let-alist (nconc bookmark '((type . "1") (port . "70")))
+ (if (and .path (string-match "\\`ftp:.*@" .path))
+ (concat "ftp://"
+ (substring .path 4 (1- (match-end 0)))
+ (substring .path (match-end 0)))
+ (and (= (length .type) 1)
+ .host ;; (ffap-machine-p host)
+ (concat "gopher://" .host
+ (if (equal .port "70") "" (concat ":" .port))
+ "/" .type .path))))))))
(defvar ffap-ftp-sans-slash-regexp
(and
diff --git a/test/lisp/ffap-tests.el b/test/lisp/ffap-tests.el
index 1ba5f86..f3414ac 100644
--- a/test/lisp/ffap-tests.el
+++ b/test/lisp/ffap-tests.el
@@ -49,6 +49,21 @@
(should (equal '(1 1) ffap-string-at-point-region)))))
(and (file-exists-p file) (delete-file file)))))
+(ert-deftest ffap-gopher-at-point ()
+ (with-temp-buffer
+ (insert "\
+Type = 1
+Name = foo
+Path = /the/path
+Port = 7070
+Host = example.com\n")
+ (should-not (ffap-gopher-at-point))
+ (goto-char (point-min))
+ (should (equal (ffap-gopher-at-point)
+ "gopher://example.com:7070/1/the/path"))
+ (should (equal ffap-string-at-point-region
+ (list (point-min) (point-max))))))
+
(provide 'ffap-tests)
;;; ffap-tests.el ends here
--
2.9.3
^ permalink raw reply related [flat|nested] 13+ messages in thread
* bug#25391: 24.5; ffap-guesser "stack overflow in regexp matcher" error may crash emacs.
2017-01-10 4:37 ` npostavs
@ 2017-01-10 7:17 ` Thierry Volpiatto
2017-01-10 13:37 ` npostavs
0 siblings, 1 reply; 13+ messages in thread
From: Thierry Volpiatto @ 2017-01-10 7:17 UTC (permalink / raw)
To: npostavs; +Cc: 25391
npostavs@users.sourceforge.net writes:
> Hmm, well I've meanwhile merged the fix for the regex stack limit, if
> you can still crash emacs this way, open a new bug.
Ok.
>> I don't know `let-alist`, but looks good, however keeping
>> `ffap-gopher-regexp` instead of hardcoding it and returning nil when the
>> regexp is nil would allow users to disable the feature.
>
> Makes sense, here's an update:
Thanks, however AFAIU your patch, when `ffap-gopher-regexp` is nil,
`ffap-gopher-at-point` will return with an error but not nil isn't it ?
--
Thierry
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#25391: 24.5; ffap-guesser "stack overflow in regexp matcher" error may crash emacs.
2017-01-10 7:17 ` Thierry Volpiatto
@ 2017-01-10 13:37 ` npostavs
2017-01-10 14:42 ` Thierry Volpiatto
0 siblings, 1 reply; 13+ messages in thread
From: npostavs @ 2017-01-10 13:37 UTC (permalink / raw)
To: Thierry Volpiatto; +Cc: 25391
[-- Attachment #1: Type: text/plain, Size: 613 bytes --]
Thierry Volpiatto <thierry.volpiatto@gmail.com> writes:
>>> I don't know `let-alist`, but looks good, however keeping
>>> `ffap-gopher-regexp` instead of hardcoding it and returning nil when the
>>> regexp is nil would allow users to disable the feature.
>>
>> Makes sense, here's an update:
>
> Thanks, however AFAIU your patch, when `ffap-gopher-regexp` is nil,
> `ffap-gopher-at-point` will return with an error but not nil isn't it ?
Yes, although that's also true before my patch. So `ffap-gopher-regexp'
never actually supported being changed. I'm not sure if it's a good
idea to add support for that.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: patch --]
[-- Type: text/x-diff, Size: 4996 bytes --]
From ed145acaeb5446e004fc6a38ff6411967a6a2222 Mon Sep 17 00:00:00 2001
From: Noam Postavsky <npostavs@gmail.com>
Date: Sun, 8 Jan 2017 18:19:32 -0500
Subject: [PATCH v3] Improve ffap-gopher-at-point handling of long lines
* lisp/ffap.el (ffap-gopher-regexp): Only match the KEY part.
(ffap--gopher-var-on-line): New function.
(ffap-gopher-at-point): Use it instead of the old ffap-gopher-regexp
which could overflow the regexp stack on long lines (Bug#25391). Use
`let-alist' instead of calling `set' on local variables.
* test/lisp/ffap-tests.el (ffap-gopher-at-point): New test.
---
lisp/ffap.el | 64 +++++++++++++++++++++++++------------------------
test/lisp/ffap-tests.el | 17 +++++++++++++
2 files changed, 50 insertions(+), 31 deletions(-)
diff --git a/lisp/ffap.el b/lisp/ffap.el
index 8144d41..182694a 100644
--- a/lisp/ffap.el
+++ b/lisp/ffap.el
@@ -1194,43 +1194,45 @@ ffap-url-at-point
val))))
(defvar ffap-gopher-regexp
- "^.*\\<\\(Type\\|Name\\|Path\\|Host\\|Port\\) *= *\\(.*\\) *$"
- "Regexp matching a line in a gopher bookmark (maybe indented).
-The two subexpressions are the KEY and VALUE.")
+ "\\<\\(Type\\|Name\\|Path\\|Host\\|Port\\) *= *"
+ "Regexp matching a key in a gopher bookmark.")
+
+(defun ffap--gopher-var-on-line ()
+ "Return (KEY . VALUE) of gopher bookmark on current line."
+ (save-excursion
+ (let ((eol (progn (end-of-line) (skip-chars-backward " ") (point)))
+ (bol (progn (beginning-of-line) (point))))
+ (when (re-search-forward ffap-gopher-regexp eol t)
+ (let ((key (match-string 1))
+ (val (buffer-substring-no-properties (match-end 0) eol)))
+ (cons (intern (downcase key)) val))))))
(defun ffap-gopher-at-point ()
"If point is inside a gopher bookmark block, return its URL.
Sets the variable `ffap-string-at-point-region' to the bounds of URL, if any."
;; `gopher-parse-bookmark' from gopher.el is not so robust
- (save-excursion
- (beginning-of-line)
- (if (looking-at ffap-gopher-regexp)
- (progn
- (while (and (looking-at ffap-gopher-regexp) (not (bobp)))
- (forward-line -1))
- (or (looking-at ffap-gopher-regexp) (forward-line 1))
- (setq ffap-string-at-point-region (list (point) (point)))
- (let ((type "1") path host (port "70"))
- (while (looking-at ffap-gopher-regexp)
- (let ((var (intern
- (downcase
- (buffer-substring (match-beginning 1)
- (match-end 1)))))
- (val (buffer-substring (match-beginning 2)
- (match-end 2))))
- (set var val)
- (forward-line 1)))
- (setcdr ffap-string-at-point-region (list (point)))
- (if (and path (string-match "^ftp:.*@" path))
- (concat "ftp://"
- (substring path 4 (1- (match-end 0)))
- (substring path (match-end 0)))
- (and (= (length type) 1)
- host;; (ffap-machine-p host)
- (concat "gopher://" host
- (if (equal port "70") "" (concat ":" port))
- "/" type path))))))))
+ (when (stringp ffap-gopher-regexp)
+ (save-excursion
+ (let* ((beg (progn (beginning-of-line)
+ (while (and (not (bobp)) (ffap--gopher-var-on-line))
+ (forward-line -1))
+ (point)))
+ (bookmark (cl-loop for keyval = (ffap--gopher-var-on-line)
+ while keyval collect keyval
+ do (forward-line 1))))
+ (when bookmark
+ (setq ffap-string-at-point-region (list beg (point)))
+ (let-alist (nconc bookmark '((type . "1") (port . "70")))
+ (if (and .path (string-match "\\`ftp:.*@" .path))
+ (concat "ftp://"
+ (substring .path 4 (1- (match-end 0)))
+ (substring .path (match-end 0)))
+ (and (= (length .type) 1)
+ .host ;; (ffap-machine-p host)
+ (concat "gopher://" .host
+ (if (equal .port "70") "" (concat ":" .port))
+ "/" .type .path)))))))))
(defvar ffap-ftp-sans-slash-regexp
(and
diff --git a/test/lisp/ffap-tests.el b/test/lisp/ffap-tests.el
index 1ba5f86..a3fe350 100644
--- a/test/lisp/ffap-tests.el
+++ b/test/lisp/ffap-tests.el
@@ -49,6 +49,23 @@
(should (equal '(1 1) ffap-string-at-point-region)))))
(and (file-exists-p file) (delete-file file)))))
+(ert-deftest ffap-gopher-at-point ()
+ (with-temp-buffer
+ (insert "\
+Type = 1
+Name = foo
+Path = /the/path
+Port = 7070
+Host = example.com\n")
+ (should-not (ffap-gopher-at-point))
+ (goto-char (point-min))
+ (should (equal (ffap-gopher-at-point)
+ "gopher://example.com:7070/1/the/path"))
+ (should (equal ffap-string-at-point-region
+ (list (point-min) (point-max))))
+ (let ((ffap-gopher-regexp nil))
+ (should-not (ffap-gopher-at-point)))))
+
(provide 'ffap-tests)
;;; ffap-tests.el ends here
--
2.9.3
^ permalink raw reply related [flat|nested] 13+ messages in thread
* bug#25391: 24.5; ffap-guesser "stack overflow in regexp matcher" error may crash emacs.
2017-01-10 13:37 ` npostavs
@ 2017-01-10 14:42 ` Thierry Volpiatto
2017-01-14 2:25 ` npostavs
0 siblings, 1 reply; 13+ messages in thread
From: Thierry Volpiatto @ 2017-01-10 14:42 UTC (permalink / raw)
To: npostavs; +Cc: 25391
npostavs@users.sourceforge.net writes:
> Yes, although that's also true before my patch. So `ffap-gopher-regexp'
> never actually supported being changed. I'm not sure if it's a good
> idea to add support for that.
I think it is, gopher is not widely used AFAIK, and allowing disabling
it would avoid needless search in most cases, thus it make it consistent
with other ffap* fns that can be disabled; I have a lot of complains at
helm with ffap annoyances and having more flexibility on this is interesting.
> + (when (stringp ffap-gopher-regexp)
That's what I expected.
Thanks.
--
Thierry
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#25391: 24.5; ffap-guesser "stack overflow in regexp matcher" error may crash emacs.
2017-01-10 14:42 ` Thierry Volpiatto
@ 2017-01-14 2:25 ` npostavs
2017-01-14 6:57 ` npostavs
[not found] ` <874m12t57f.fsf@gmail.com>
0 siblings, 2 replies; 13+ messages in thread
From: npostavs @ 2017-01-14 2:25 UTC (permalink / raw)
To: Thierry Volpiatto; +Cc: 25391
[-- Attachment #1: Type: text/plain, Size: 783 bytes --]
Thierry Volpiatto <thierry.volpiatto@gmail.com> writes:
> npostavs@users.sourceforge.net writes:
>
>> Yes, although that's also true before my patch. So `ffap-gopher-regexp'
>> never actually supported being changed. I'm not sure if it's a good
>> idea to add support for that.
>
> I think it is, gopher is not widely used AFAIK, and allowing disabling
> it would avoid needless search in most cases, thus it make it consistent
> with other ffap* fns that can be disabled; I have a lot of complains at
> helm with ffap annoyances and having more flexibility on this is interesting.
Oh, yes, if the other regexps can be disabled like that, we should make it
consistent. I've added a note about it to the docstring and toplevel
comments; I'll push to master in a couple of days.
[-- Attachment #2: patch --]
[-- Type: text/plain, Size: 5524 bytes --]
From e4904a9c5c871780b94ffd2cf433637e5d75755a Mon Sep 17 00:00:00 2001
From: Noam Postavsky <npostavs@gmail.com>
Date: Sun, 8 Jan 2017 18:19:32 -0500
Subject: [PATCH v4] Improve ffap-gopher-at-point handling of long lines
* lisp/ffap.el (ffap-gopher-regexp): Only match the KEY part. Note
setting to nil is now supported.
(ffap--gopher-var-on-line): New function.
(ffap-gopher-at-point): Use it instead of the old ffap-gopher-regexp
which could overflow the regexp stack on long lines (Bug#25391). Use
`let-alist' instead of calling `set' on local variables.
* test/lisp/ffap-tests.el (ffap-gopher-at-point): New test.
---
lisp/ffap.el | 66 ++++++++++++++++++++++++++-----------------------
test/lisp/ffap-tests.el | 17 +++++++++++++
2 files changed, 52 insertions(+), 31 deletions(-)
diff --git a/lisp/ffap.el b/lisp/ffap.el
index 8144d41..0baf52b 100644
--- a/lisp/ffap.el
+++ b/lisp/ffap.el
@@ -76,6 +76,7 @@
;; (setq ffap-machine-p-known 'accept) ; no pinging
;; (setq ffap-url-regexp nil) ; disable URL features in ffap
;; (setq ffap-shell-prompt-regexp nil) ; disable shell prompt stripping
+;; (setq ffap-gopher-regexp nil) ; disable gopher bookmark matching
;;
;; ffap uses `browse-url' (if found, else `w3-fetch') to fetch URL's.
;; For a hairier `ffap-url-fetcher', try ffap-url.el (same ftp site).
@@ -1194,43 +1195,46 @@ ffap-url-at-point
val))))
(defvar ffap-gopher-regexp
- "^.*\\<\\(Type\\|Name\\|Path\\|Host\\|Port\\) *= *\\(.*\\) *$"
- "Regexp matching a line in a gopher bookmark (maybe indented).
-The two subexpressions are the KEY and VALUE.")
+ "\\<\\(Type\\|Name\\|Path\\|Host\\|Port\\) *= *"
+ "Regexp matching a key in a gopher bookmark.
+Set to nil to disable matching gopher bookmarks."
+
+(defun ffap--gopher-var-on-line ()
+ "Return (KEY . VALUE) of gopher bookmark on current line."
+ (save-excursion
+ (let ((eol (progn (end-of-line) (skip-chars-backward " ") (point)))
+ (bol (progn (beginning-of-line) (point))))
+ (when (re-search-forward ffap-gopher-regexp eol t)
+ (let ((key (match-string 1))
+ (val (buffer-substring-no-properties (match-end 0) eol)))
+ (cons (intern (downcase key)) val))))))
(defun ffap-gopher-at-point ()
"If point is inside a gopher bookmark block, return its URL.
Sets the variable `ffap-string-at-point-region' to the bounds of URL, if any."
;; `gopher-parse-bookmark' from gopher.el is not so robust
- (save-excursion
- (beginning-of-line)
- (if (looking-at ffap-gopher-regexp)
- (progn
- (while (and (looking-at ffap-gopher-regexp) (not (bobp)))
- (forward-line -1))
- (or (looking-at ffap-gopher-regexp) (forward-line 1))
- (setq ffap-string-at-point-region (list (point) (point)))
- (let ((type "1") path host (port "70"))
- (while (looking-at ffap-gopher-regexp)
- (let ((var (intern
- (downcase
- (buffer-substring (match-beginning 1)
- (match-end 1)))))
- (val (buffer-substring (match-beginning 2)
- (match-end 2))))
- (set var val)
- (forward-line 1)))
- (setcdr ffap-string-at-point-region (list (point)))
- (if (and path (string-match "^ftp:.*@" path))
- (concat "ftp://"
- (substring path 4 (1- (match-end 0)))
- (substring path (match-end 0)))
- (and (= (length type) 1)
- host;; (ffap-machine-p host)
- (concat "gopher://" host
- (if (equal port "70") "" (concat ":" port))
- "/" type path))))))))
+ (when (stringp ffap-gopher-regexp)
+ (save-excursion
+ (let* ((beg (progn (beginning-of-line)
+ (while (and (not (bobp)) (ffap--gopher-var-on-line))
+ (forward-line -1))
+ (point)))
+ (bookmark (cl-loop for keyval = (ffap--gopher-var-on-line)
+ while keyval collect keyval
+ do (forward-line 1))))
+ (when bookmark
+ (setq ffap-string-at-point-region (list beg (point)))
+ (let-alist (nconc bookmark '((type . "1") (port . "70")))
+ (if (and .path (string-match "\\`ftp:.*@" .path))
+ (concat "ftp://"
+ (substring .path 4 (1- (match-end 0)))
+ (substring .path (match-end 0)))
+ (and (= (length .type) 1)
+ .host ;; (ffap-machine-p host)
+ (concat "gopher://" .host
+ (if (equal .port "70") "" (concat ":" .port))
+ "/" .type .path)))))))))
(defvar ffap-ftp-sans-slash-regexp
(and
diff --git a/test/lisp/ffap-tests.el b/test/lisp/ffap-tests.el
index 1ba5f86..a3fe350 100644
--- a/test/lisp/ffap-tests.el
+++ b/test/lisp/ffap-tests.el
@@ -49,6 +49,23 @@
(should (equal '(1 1) ffap-string-at-point-region)))))
(and (file-exists-p file) (delete-file file)))))
+(ert-deftest ffap-gopher-at-point ()
+ (with-temp-buffer
+ (insert "\
+Type = 1
+Name = foo
+Path = /the/path
+Port = 7070
+Host = example.com\n")
+ (should-not (ffap-gopher-at-point))
+ (goto-char (point-min))
+ (should (equal (ffap-gopher-at-point)
+ "gopher://example.com:7070/1/the/path"))
+ (should (equal ffap-string-at-point-region
+ (list (point-min) (point-max))))
+ (let ((ffap-gopher-regexp nil))
+ (should-not (ffap-gopher-at-point)))))
+
(provide 'ffap-tests)
;;; ffap-tests.el ends here
--
2.9.3
^ permalink raw reply related [flat|nested] 13+ messages in thread
* bug#25391: 24.5; ffap-guesser "stack overflow in regexp matcher" error may crash emacs.
2017-01-14 2:25 ` npostavs
@ 2017-01-14 6:57 ` npostavs
[not found] ` <874m12t57f.fsf@gmail.com>
1 sibling, 0 replies; 13+ messages in thread
From: npostavs @ 2017-01-14 6:57 UTC (permalink / raw)
To: Thierry Volpiatto; +Cc: 25391
[-- Attachment #1: Type: text/plain, Size: 442 bytes --]
npostavs@users.sourceforge.net writes:
> (defvar ffap-gopher-regexp
> - "^.*\\<\\(Type\\|Name\\|Path\\|Host\\|Port\\) *= *\\(.*\\) *$"
> - "Regexp matching a line in a gopher bookmark (maybe indented).
> -The two subexpressions are the KEY and VALUE.")
> + "\\<\\(Type\\|Name\\|Path\\|Host\\|Port\\) *= *"
> + "Regexp matching a key in a gopher bookmark.
> +Set to nil to disable matching gopher bookmarks."
Oops, lost a close paren.
[-- Attachment #2: patch --]
[-- Type: text/plain, Size: 5525 bytes --]
From 98e9ff3cb73acc5e177abc907f05bb8e3ff09712 Mon Sep 17 00:00:00 2001
From: Noam Postavsky <npostavs@gmail.com>
Date: Sun, 8 Jan 2017 18:19:32 -0500
Subject: [PATCH v5] Improve ffap-gopher-at-point handling of long lines
* lisp/ffap.el (ffap-gopher-regexp): Only match the KEY part. Note
setting to nil is now supported.
(ffap--gopher-var-on-line): New function.
(ffap-gopher-at-point): Use it instead of the old ffap-gopher-regexp
which could overflow the regexp stack on long lines (Bug#25391). Use
`let-alist' instead of calling `set' on local variables.
* test/lisp/ffap-tests.el (ffap-gopher-at-point): New test.
---
lisp/ffap.el | 66 ++++++++++++++++++++++++++-----------------------
test/lisp/ffap-tests.el | 17 +++++++++++++
2 files changed, 52 insertions(+), 31 deletions(-)
diff --git a/lisp/ffap.el b/lisp/ffap.el
index 8144d41..068897b 100644
--- a/lisp/ffap.el
+++ b/lisp/ffap.el
@@ -76,6 +76,7 @@
;; (setq ffap-machine-p-known 'accept) ; no pinging
;; (setq ffap-url-regexp nil) ; disable URL features in ffap
;; (setq ffap-shell-prompt-regexp nil) ; disable shell prompt stripping
+;; (setq ffap-gopher-regexp nil) ; disable gopher bookmark matching
;;
;; ffap uses `browse-url' (if found, else `w3-fetch') to fetch URL's.
;; For a hairier `ffap-url-fetcher', try ffap-url.el (same ftp site).
@@ -1194,43 +1195,46 @@ ffap-url-at-point
val))))
(defvar ffap-gopher-regexp
- "^.*\\<\\(Type\\|Name\\|Path\\|Host\\|Port\\) *= *\\(.*\\) *$"
- "Regexp matching a line in a gopher bookmark (maybe indented).
-The two subexpressions are the KEY and VALUE.")
+ "\\<\\(Type\\|Name\\|Path\\|Host\\|Port\\) *= *"
+ "Regexp matching a key in a gopher bookmark.
+Set to nil to disable matching gopher bookmarks.")
+
+(defun ffap--gopher-var-on-line ()
+ "Return (KEY . VALUE) of gopher bookmark on current line."
+ (save-excursion
+ (let ((eol (progn (end-of-line) (skip-chars-backward " ") (point)))
+ (bol (progn (beginning-of-line) (point))))
+ (when (re-search-forward ffap-gopher-regexp eol t)
+ (let ((key (match-string 1))
+ (val (buffer-substring-no-properties (match-end 0) eol)))
+ (cons (intern (downcase key)) val))))))
(defun ffap-gopher-at-point ()
"If point is inside a gopher bookmark block, return its URL.
Sets the variable `ffap-string-at-point-region' to the bounds of URL, if any."
;; `gopher-parse-bookmark' from gopher.el is not so robust
- (save-excursion
- (beginning-of-line)
- (if (looking-at ffap-gopher-regexp)
- (progn
- (while (and (looking-at ffap-gopher-regexp) (not (bobp)))
- (forward-line -1))
- (or (looking-at ffap-gopher-regexp) (forward-line 1))
- (setq ffap-string-at-point-region (list (point) (point)))
- (let ((type "1") path host (port "70"))
- (while (looking-at ffap-gopher-regexp)
- (let ((var (intern
- (downcase
- (buffer-substring (match-beginning 1)
- (match-end 1)))))
- (val (buffer-substring (match-beginning 2)
- (match-end 2))))
- (set var val)
- (forward-line 1)))
- (setcdr ffap-string-at-point-region (list (point)))
- (if (and path (string-match "^ftp:.*@" path))
- (concat "ftp://"
- (substring path 4 (1- (match-end 0)))
- (substring path (match-end 0)))
- (and (= (length type) 1)
- host;; (ffap-machine-p host)
- (concat "gopher://" host
- (if (equal port "70") "" (concat ":" port))
- "/" type path))))))))
+ (when (stringp ffap-gopher-regexp)
+ (save-excursion
+ (let* ((beg (progn (beginning-of-line)
+ (while (and (not (bobp)) (ffap--gopher-var-on-line))
+ (forward-line -1))
+ (point)))
+ (bookmark (cl-loop for keyval = (ffap--gopher-var-on-line)
+ while keyval collect keyval
+ do (forward-line 1))))
+ (when bookmark
+ (setq ffap-string-at-point-region (list beg (point)))
+ (let-alist (nconc bookmark '((type . "1") (port . "70")))
+ (if (and .path (string-match "\\`ftp:.*@" .path))
+ (concat "ftp://"
+ (substring .path 4 (1- (match-end 0)))
+ (substring .path (match-end 0)))
+ (and (= (length .type) 1)
+ .host ;; (ffap-machine-p host)
+ (concat "gopher://" .host
+ (if (equal .port "70") "" (concat ":" .port))
+ "/" .type .path)))))))))
(defvar ffap-ftp-sans-slash-regexp
(and
diff --git a/test/lisp/ffap-tests.el b/test/lisp/ffap-tests.el
index 1ba5f86..a3fe350 100644
--- a/test/lisp/ffap-tests.el
+++ b/test/lisp/ffap-tests.el
@@ -49,6 +49,23 @@
(should (equal '(1 1) ffap-string-at-point-region)))))
(and (file-exists-p file) (delete-file file)))))
+(ert-deftest ffap-gopher-at-point ()
+ (with-temp-buffer
+ (insert "\
+Type = 1
+Name = foo
+Path = /the/path
+Port = 7070
+Host = example.com\n")
+ (should-not (ffap-gopher-at-point))
+ (goto-char (point-min))
+ (should (equal (ffap-gopher-at-point)
+ "gopher://example.com:7070/1/the/path"))
+ (should (equal ffap-string-at-point-region
+ (list (point-min) (point-max))))
+ (let ((ffap-gopher-regexp nil))
+ (should-not (ffap-gopher-at-point)))))
+
(provide 'ffap-tests)
;;; ffap-tests.el ends here
--
2.9.3
^ permalink raw reply related [flat|nested] 13+ messages in thread
* bug#25391: 24.5; ffap-guesser "stack overflow in regexp matcher" error may crash emacs.
[not found] ` <874m12t57f.fsf@gmail.com>
@ 2017-01-14 14:43 ` Noam Postavsky
[not found] ` <8737gltvw8.fsf@gmail.com>
0 siblings, 1 reply; 13+ messages in thread
From: Noam Postavsky @ 2017-01-14 14:43 UTC (permalink / raw)
To: Thierry Volpiatto; +Cc: 25391
On Sat, Jan 14, 2017 at 3:29 AM, Thierry Volpiatto
<thierry.volpiatto@gmail.com> wrote:
>
> npostavs@users.sourceforge.net writes:
>
>> Oh, yes, if the other regexps can be disabled like that, we should make it
>> consistent. I've added a note about it to the docstring and toplevel
>> comments; I'll push to master in a couple of days.
>
> Great thanks, perhaps you can notify also about ffap-alist==nil which
> helps too to disable ffap.
There is already this at the top of the file:
;; (setq ffap-alist nil) ; faster, dumber prompting
Did you have something else in mind?
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#25391: 24.5; ffap-guesser "stack overflow in regexp matcher" error may crash emacs.
[not found] ` <8737gltvw8.fsf@gmail.com>
@ 2017-01-15 19:08 ` Noam Postavsky
0 siblings, 0 replies; 13+ messages in thread
From: Noam Postavsky @ 2017-01-15 19:08 UTC (permalink / raw)
To: Thierry Volpiatto; +Cc: 25391
tag 25391 fixed
close 25391 26.1
quit
On Sat, Jan 14, 2017 at 12:05 PM, Thierry Volpiatto
<thierry.volpiatto@gmail.com> wrote:
>
>>>
>>> Great thanks, perhaps you can notify also about ffap-alist==nil which
>>> helps too to disable ffap.
>>
>> There is already this at the top of the file:
>>
>> ;; (setq ffap-alist nil) ; faster, dumber prompting
>
> Ah, good sorry I mess it.
>
>> Did you have something else in mind?
>
> No, think it's good now.
>
> Thanks.
>
> --
> Thierry
I've pushed to master [1: fd6b829]
1: 2017-01-15 13:04:54 -0500 fd6b829d91da73a945643b5916ee6d79c992e030
Improve ffap-gopher-at-point handling of long lines
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2017-01-15 19:08 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-01-08 7:31 bug#25391: 24.5; ffap-guesser "stack overflow in regexp matcher" error may crash emacs Thierry Volpiatto
2017-01-08 15:08 ` npostavs
2017-01-08 17:28 ` Thierry Volpiatto
2017-01-08 23:29 ` npostavs
2017-01-09 7:00 ` Thierry Volpiatto
2017-01-10 4:37 ` npostavs
2017-01-10 7:17 ` Thierry Volpiatto
2017-01-10 13:37 ` npostavs
2017-01-10 14:42 ` Thierry Volpiatto
2017-01-14 2:25 ` npostavs
2017-01-14 6:57 ` npostavs
[not found] ` <874m12t57f.fsf@gmail.com>
2017-01-14 14:43 ` Noam Postavsky
[not found] ` <8737gltvw8.fsf@gmail.com>
2017-01-15 19:08 ` Noam Postavsky
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).