]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix execution of MS-Windows app execution aliases in Eshell
authorJim Porter <jporterbugs@gmail.com>
Sat, 22 Jun 2024 19:45:19 +0000 (12:45 -0700)
committerEshel Yaron <me@eshelyaron.com>
Mon, 8 Jul 2024 20:58:26 +0000 (22:58 +0200)
* lisp/eshell/esh-ext.el (eshell-script-interpreter): Check for 0-size
files (bug#71655).

(cherry picked from commit 130c3efa108de4db0a4a8b7521ecf6551efa89cb)

lisp/eshell/esh-ext.el

index 3c4deb32601ae2f089f79a5366c2ecc64f3db2f7..cf93d2904da8ca870a933bdbb62e4c55a7477015 100644 (file)
@@ -301,7 +301,17 @@ Return nil, or a list of the form:
   (INTERPRETER [ARGS] FILE)"
   (let ((maxlen eshell-command-interpreter-max-length))
     (if (and (file-readable-p file)
-            (file-regular-p file))
+            (file-regular-p file)
+             ;; If the file is zero bytes, it can't possibly have a
+             ;; shebang.  This check may seem redundant, but we can
+             ;; encounter files that Emacs considers both readable and
+             ;; regular, but which aren't *actually* readable.  This can
+             ;; happen, for example, with certain kinds of reparse
+             ;; points like APPEXECLINK on NTFS filesystems (MS-Windows
+             ;; uses these for "app execution aliases").  In these
+             ;; cases, the file size is 0, so this check protects us
+             ;; from errors.
+             (> (file-attribute-size (file-attributes file)) 0))
        (with-temp-buffer
          (insert-file-contents-literally file nil 0 maxlen)
          (if (looking-at "#![ \t]*\\([^ \r\t\n]+\\)\\([ \t]+\\(.+\\)\\)?")