diff --git a/sys/dev/vt/vt_buf.c b/sys/dev/vt/vt_buf.c --- a/sys/dev/vt/vt_buf.c +++ b/sys/dev/vt/vt_buf.c @@ -742,7 +742,7 @@ ei = e.tp_row * vb->vb_scr_size.tp_col + e.tp_col; /* Number symbols and number of rows to inject \n */ - sz = ei - si + ((e.tp_row - s.tp_row) * 2); + sz = ei - si + (e.tp_row - s.tp_row); return (sz * sizeof(term_char_t)); } @@ -750,7 +750,7 @@ void vtbuf_extract_marked(struct vt_buf *vb, term_char_t *buf, int sz) { - int i, r, c, cs, ce; + int i, j, r, c, cs, ce; term_pos_t s, e; /* Swap according to window coordinates. */ @@ -769,15 +769,29 @@ for (r = s.tp_row; r <= e.tp_row; r++) { cs = (r == s.tp_row)?s.tp_col:0; ce = (r == e.tp_row)?e.tp_col:vb->vb_scr_size.tp_col; - for (c = cs; c < ce; c++) { + + /* Copy characters from terminal window. */ + j = i; + for (c = cs; c < ce; c++) buf[i++] = vb->vb_rows[r][c]; + + /* Trim trailing whitespace from each line, if any. */ + for (; i != j; i--) { + if (TCHAR_CHARACTER(buf[i - 1]) == ' ') + buf[i - 1] = '\0'; + else + break; } + /* Add new line for all rows, but not for last one. */ - if (r != e.tp_row) { - buf[i++] = '\r'; + if (r != e.tp_row) buf[i++] = '\n'; - } } + /* Zero rest of expected buffer size, if any. */ + while ((i * sizeof(buf[0])) < sz) + buf[i++] = '\0'; + + MPASS((i * sizeof(buf[0])) == sz); } int diff --git a/sys/dev/vt/vt_core.c b/sys/dev/vt/vt_core.c --- a/sys/dev/vt/vt_core.c +++ b/sys/dev/vt/vt_core.c @@ -2287,8 +2287,7 @@ VD_PASTEBUFSZ(vd) = len; } /* Request copy/paste buffer data, no more than `len' */ - vtbuf_extract_marked(&vw->vw_buf, VD_PASTEBUF(vd), - VD_PASTEBUFSZ(vd)); + vtbuf_extract_marked(&vw->vw_buf, VD_PASTEBUF(vd), len); VD_PASTEBUFLEN(vd) = len;