changeset 112003:2a665aeb6cbc

* dnd.el (dnd-get-local-file-name): Unhex of file name shall always be performed (Bug#7680).
author Jan D. <jan.h.d@swipnet.se>
date Mon, 20 Dec 2010 21:11:01 +0100
parents dc2134428db3
children 7a4b15c4bbed
files lisp/ChangeLog lisp/dnd.el
diffstat 2 files changed, 20 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Mon Dec 20 22:44:28 2010 +0800
+++ b/lisp/ChangeLog	Mon Dec 20 21:11:01 2010 +0100
@@ -1,3 +1,8 @@
+2010-12-20  Leo  <sdl.web@gmail.com>
+
+	* dnd.el (dnd-get-local-file-name): Unhex of file name shall
+	always be performed (Bug#7680).
+
 2010-12-20  Chong Yidong  <cyd@stupidchicken.com>
 
 	* menu-bar.el (menu-bar-kill-ring-save): Make obsolete.
--- a/lisp/dnd.el	Mon Dec 20 22:44:28 2010 +0800
+++ b/lisp/dnd.el	Mon Dec 20 21:11:01 2010 +0100
@@ -135,6 +135,16 @@
 		 (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 @@
 		  (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)