From 5e0d957fe021bc921bfa4f7568f5501c43ca7fc5 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Tue, 7 Feb 2012 19:44:36 +0200 Subject: [PATCH] Fix bug #4673 with Dired when `stat' fails for ".." or other files. lisp/ls-lisp.el (ls-lisp-sanitize): New function. (ls-lisp-insert-directory): Use it to fix or remove any elements in file-alist with missing attributes. --- lisp/ChangeLog | 6 ++++++ lisp/ls-lisp.el | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 60ececebe26..2ac59b16494 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2012-02-07 Eli Zaretskii + + * ls-lisp.el (ls-lisp-sanitize): New function. + (ls-lisp-insert-directory): Use it to fix or remove any elements + in file-alist with missing attributes. (Bug#4673) + 2012-02-07 Alan Mackenzie Fix spurious recognition of c-in-knr-argdecl. diff --git a/lisp/ls-lisp.el b/lisp/ls-lisp.el index 576c746761d..de489871887 100644 --- a/lisp/ls-lisp.el +++ b/lisp/ls-lisp.el @@ -331,6 +331,7 @@ not contain `d', so that a full listing is expected." ;; do all bindings here for speed total-line files elt short file-size attr fuid fgid uid-len gid-len) + (setq file-alist (ls-lisp-sanitize file-alist)) (cond ((memq ?A switches) (setq file-alist (ls-lisp-delete-matching "^\\.\\.?$" file-alist))) @@ -437,6 +438,22 @@ not contain `d', so that a full listing is expected." (message "%s: doesn't exist or is inaccessible" file) (ding) (sit-for 2))))) ; to show user the message! +(defun ls-lisp-sanitize (file-alist) + "Sanitize the elements in FILE-ALIST. +Fixes any elements in the alist for directory entries whose file +attributes are nil (meaning that `file-attributes' failed for +them). This is known to happen for some network shares, in +particular for the \"..\" directory entry. + +If the \"..\" directory entry has nil attributes, the attributes +are copied from the \".\" entry, if they are non-nil. Otherwise, +the offending element is removed from the list, as are any +elements for other directory entries with nil attributes." + (if (and (null (cdr (assoc ".." file-alist))) + (cdr (assoc "." file-alist))) + (setcdr (assoc ".." file-alist) (cdr (assoc "." file-alist)))) + (rassq-delete-all nil file-alist)) + (defun ls-lisp-column-format (file-alist) "Insert the file names (only) in FILE-ALIST into the current buffer. Format in columns, sorted vertically, following GNU ls -C.