Subject: bug#29189: 25.3; Dired does not work with binary filenames

From: Eli Zaretskii <[email-masked]>
Date: Sat, 11 Nov 2017 17:21:21 +0200

> Date: Sat, 11 Nov 2017 16:18:20 +0200
> From: Eli Zaretskii <[email-masked]>
> Cc: [email-masked], [email-masked]
> 
> The problem is in insert-directory.  It manually decodes each file
> name which was output by 'ls', and that produces strangely
> inconsistent results when the file name includes raw bytes: sometimes
> we get the 2-byte sequence starting with \300, sometimes the original
> byte survives unchanged, and sometimes I see the sequence \301\200
> instead of a lone \300 in the file name.  I'm trying to understand
> what's going on and find a solution to that.

Can you please try the patch below?  (You will need to re-dump Emacs
after patching files.el.)

diff --git a/lisp/files.el b/lisp/files.el
index b47411f..43198bc 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -6803,10 +6803,13 @@ insert-directory
 			    val (get-text-property (point) 'dired-filename))
 		      (goto-char (next-single-property-change
 				  (point) 'dired-filename nil (point-max)))
-		      ;; Force no eol conversion on a file name, so
-		      ;; that CR is preserved.
-		      (decode-coding-region pos (point)
-					    (if val coding-no-eol coding))
+                      (let ((fn (buffer-substring-no-properties pos (point))))
+                        (delete-region pos (point))
+                        (insert
+		         ;; Force no eol conversion on a file name, so
+		         ;; that CR is preserved.
+		         (decode-coding-string (string-make-unibyte fn)
+					       (if val coding-no-eol coding))))
 		      (if val
 			  (put-text-property pos (point)
 					     'dired-filename t)))))))