>From bd576ed162cd3379cb945d8796d158d9563aa48e Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 11 Feb 2017 19:47:55 -0500 Subject: [PATCH v4 6/6] 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. --- doc/emacs/killing.texi | 4 ++++ etc/NEWS | 4 ++++ lisp/select.el | 3 +++ lisp/term/w32-win.el | 2 +- 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/doc/emacs/killing.texi b/doc/emacs/killing.texi index 47de053129..0b5efd04a1 100644 --- a/doc/emacs/killing.texi +++ b/doc/emacs/killing.texi @@ -519,6 +519,10 @@ Clipboard 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 21510fe539..281bacffd0 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -326,6 +326,10 @@ 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 variable of this kind to swap modifiers in Emacs. diff --git a/lisp/select.el b/lisp/select.el index 4849d7d515..579c5c7e2e 100644 --- a/lisp/select.el +++ b/lisp/select.el @@ -475,6 +475,9 @@ (defun xselect--encode-string (type str &optional can-modify) (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 fda93884c4..be895a040d 100644 --- a/lisp/term/w32-win.el +++ b/lisp/term/w32-win.el @@ -396,7 +396,7 @@ (declare-function w32-selection-exists-p "w32select.c") ;;; 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) -- 2.11.1