|
From: | Jason Rumney |
Subject: | Re: [gmane.emacs.bugs] Emacs fails to start properly if the current working directory is on a vfat or ntfs filesystem |
Date: | Tue, 26 Feb 2008 09:39:10 +0000 |
User-agent: | Thunderbird 2.0.0.9 (Windows/20071031) |
Stefan Monnier wrote:
Here is a patch against EMACS_22_BASE.I'd rather use a less arbitrary scheme. E.g. - only accept unchanged safe chars (rather than rule out dangerous ones), e.g. [:alnum:] and maybe a couple more. - everything else encoded following quoted-printable. Of course, QP applies to bytes, not to chars, which also points to a potential problem with [:alnum:] since it includes multibyte chars which may also be rejected, but I think that would be safe enough for a start.
OK, here's a revised patch that accepts only ASCII alphanumerics, -, _, ., ~, # and +, and percent encodes all others. It's not strict URL encoding, since multibyte characters will be translated to more than two hex characters, but as far as I can tell the encoding doesn't have to be reversable, just give unique names that don't contain invalid characters, so I think it is good enough. On the trunk it is cheap and easy to convert to utf-8, so we could properly URL encode them there.
*** files.el.~1.896.2.38.~ 2008-02-24 16:51:32.796875000 +0000 --- files.el 2008-02-26 09:27:34.078125000 +0000 *************** *** 4561,4575 **** (let ((buffer-name (buffer-name)) (limit 0) file-name) ! ;; Eliminate all slashes and backslashes by ! ;; replacing them with sequences that start with %. ! ;; Quote % also, to keep distinct names distinct. ! (while (string-match "[/\\%]" buffer-name limit) (let* ((character (aref buffer-name (match-beginning 0))) (replacement ! (cond ((eq character ?%) "%%") ! ((eq character ?/) "%+") ! ((eq character ?\\) "%-")))) (setq buffer-name (replace-match replacement t t buffer-name)) (setq limit (1+ (match-end 0))))) ;; Generate the file name. --- 4561,4576 ---- (let ((buffer-name (buffer-name)) (limit 0) file-name) ! ;; Restrict the characters used in the file name to those which ! ;; are known to be safe on all filesystems, url-encoding the ! ;; rest. ! ;; We do this on all platforms, because even if we are not ! ;; running on DOS/Windows, the current directory may be on a ! ;; mounted VFAT filesystem, such as a USB memory stick. ! (while (string-match "[^A-Za-z0-9-_.~#+]" buffer-name limit) (let* ((character (aref buffer-name (match-beginning 0))) (replacement ! (format "%%%02X" character))) (setq buffer-name (replace-match replacement t t buffer-name)) (setq limit (1+ (match-end 0))))) ;; Generate the file name.
[Prev in Thread] | Current Thread | [Next in Thread] |