From: Jan Djärv Date: Mon, 20 Dec 2010 20:11:01 +0000 (+0100) Subject: * dnd.el (dnd-get-local-file-name): Unhex of file name shall X-Git-Tag: emacs-pretest-24.0.90~104^2~618^2~1322^2~278^2~78 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=adc0b7934703173b0f351a44181a6317dcf59acf;p=emacs.git * dnd.el (dnd-get-local-file-name): Unhex of file name shall always be performed (Bug#7680). --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 510bfcdd2c4..8b60f871d78 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2010-12-20 Leo + + * dnd.el (dnd-get-local-file-name): Unhex of file name shall + always be performed (Bug#7680). + 2010-12-20 Chong Yidong * menu-bar.el (menu-bar-kill-ring-save): Make obsolete. diff --git a/lisp/dnd.el b/lisp/dnd.el index cbbef384436..0d2316e12b1 100644 --- a/lisp/dnd.el +++ b/lisp/dnd.el @@ -135,6 +135,16 @@ Return nil if URI is not a local file." (string-equal system-name-no-dot hostname))) (concat "file://" (substring uri (+ 7 (length hostname))))))) +(defsubst dnd-unescape-uri (uri) + (replace-regexp-in-string + "%[A-Fa-f0-9][A-Fa-f0-9]" + (lambda (arg) + (let ((str (make-string 1 0))) + (aset str 0 (string-to-number (substring arg 1) 16)) + str)) + uri t t)) + +;; http://lists.gnu.org/archive/html/emacs-devel/2006-05/msg01060.html (defun dnd-get-local-file-name (uri &optional must-exist) "Return file name converted from file:/// or file: syntax. URI is the uri for the file. If MUST-EXIST is given and non-nil, @@ -144,21 +154,11 @@ Return nil if URI is not a local file." (substring uri (1- (match-end 0)))) ((string-match "^file:" uri) ; Old KDE, Motif, Sun (substring uri (match-end 0)))))) - (when (and f must-exist) - (setq f (replace-regexp-in-string - "%[A-Fa-f0-9][A-Fa-f0-9]" - (lambda (arg) - (let ((str (make-string 1 0))) - (aset str 0 (string-to-number (substring arg 1) 16)) - str)) - f t t)) - (let* ((decoded-f (decode-coding-string - f - (or file-name-coding-system - default-file-name-coding-system)))) - (setq f (cond ((file-readable-p decoded-f) decoded-f) - ((file-readable-p f) f) - (t nil))))) + (and f (setq f (decode-coding-string (dnd-unescape-uri f) + (or file-name-coding-system + default-file-name-coding-system)))) + (when (and f must-exist (not (file-readable-p f))) + (setq f nil)) f)) (defun dnd-open-local-file (uri action)