From: Noam Postavsky Date: Sun, 12 Feb 2017 00:47:55 +0000 (-0500) Subject: Escape NUL bytes in X selections (Bug#6991) X-Git-Tag: emacs-26.0.90~521^2~11^2~29^2 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=c87c87fcc361494815bbd1d92f450b0b80a3ecbb;p=emacs.git Escape NUL bytes in X selections (Bug#6991) * lisp/term/w32-win.el (w32--set-selection): * lisp/select.el (xselect--encode-string): Replace NUL bytes with "\0". * doc/emacs/killing.texi: Document new behavior. * etc/NEWS (times): Announce it. --- diff --git a/doc/emacs/killing.texi b/doc/emacs/killing.texi index 47de0531292..0b5efd04a18 100644 --- a/doc/emacs/killing.texi +++ b/doc/emacs/killing.texi @@ -519,6 +519,10 @@ when exiting Emacs; if you wish to prevent Emacs from transferring data to the clipboard manager, change the variable @code{x-select-enable-clipboard-manager} to @code{nil}. + Since strings containing NUL bytes are usually truncated when passed +through the clipboard, Emacs replaces such characters with ``\0'' +before transfering them to the system's clipboard. + @vindex select-enable-primary @findex clipboard-kill-region @findex clipboard-kill-ring-save diff --git a/etc/NEWS b/etc/NEWS index 319b40f5d1a..dc9393c87d4 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -325,6 +325,10 @@ debug.el and edebug.el have been updated to heed to this variable. The old behaviour of using 'prin1' can be restored by customizing the new option 'debugger-print-function'. ++++ +** NUL bytes in strings copied to the system clipboard are now +replaced with "\0". + +++ ** The new variable 'x-ctrl-keysym' has been added to the existing roster of X keysyms. It can be used in combination with another diff --git a/lisp/select.el b/lisp/select.el index 4849d7d515e..579c5c7e2ee 100644 --- a/lisp/select.el +++ b/lisp/select.el @@ -475,6 +475,9 @@ two markers or an overlay. Otherwise, it is nil." (t (error "Unknown selection type: %S" type))))) + ;; Most programs are unable to handle NUL bytes in strings. + (setq str (replace-regexp-in-string "\0" "\\0" str t t)) + (setq next-selection-coding-system nil) (cons type str)))) diff --git a/lisp/term/w32-win.el b/lisp/term/w32-win.el index fda93884c40..be895a040da 100644 --- a/lisp/term/w32-win.el +++ b/lisp/term/w32-win.el @@ -396,7 +396,7 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.") ;;; Fix interface to (X-specific) mouse.el (defun w32--set-selection (type value) (if (eq type 'CLIPBOARD) - (w32-set-clipboard-data value) + (w32-set-clipboard-data (replace-regexp-in-string "\0" "\\0" value t t)) (put 'x-selections (or type 'PRIMARY) value))) (defun w32--get-selection (&optional type data-type)