emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [gmane.emacs.bugs] Emacs fails to start properly if the current work


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.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]