diff --git a/window-copy.c b/window-copy.c
index 3e9ca49..30b2f45 100644
--- a/window-copy.c
+++ b/window-copy.c
@@ -1463,9 +1463,10 @@ void
 window_copy_copy_pipe(
     struct window_pane *wp, struct session *sess, int idx, const char *arg)
 {
-	void		*buf;
-	size_t		 len;
-	struct job	*job;
+	void			*buf;
+	size_t			 len;
+	struct job		*job;
+	struct paste_buffer	*pb;
 
 
 	buf = window_copy_get_selection(wp, &len);
@@ -1476,19 +1477,32 @@ window_copy_copy_pipe(
 	bufferevent_write(job->event, buf, len);
 
 	window_copy_copy_buffer(wp, idx, buf, len);
+
+	if (idx == -1)
+		idx = 0;
+	pb = paste_get_index(&global_buffers, idx);
+	if (pb == NULL || pb->data != buf)
+		free(buf);
 }
 
 void
 window_copy_copy_selection(struct window_pane *wp, int idx)
 {
-	void*	buf;
-	size_t	len;
+	void			*buf;
+	size_t			 len;
+	struct paste_buffer	*pb;
 
 	buf = window_copy_get_selection(wp, &len);
 	if (buf == NULL)
 		return;
 
 	window_copy_copy_buffer(wp, idx, buf, len);
+
+	if (idx == -1)
+		idx = 0;
+	pb = paste_get_index(&global_buffers, idx);
+	if (pb == NULL || pb->data != buf)
+		free(buf);
 }
 
 void
