Skip to content

Commit

Permalink
win, tty: handle empty buffer in uv_tty_write_bufs
Browse files Browse the repository at this point in the history
In uv_tty_write_bufs, if the console supports Virtual Terminal sequences,
we try to convert the passed in utf8 buffer to utf16. However, we need
to check if the buffer is of non-zero length- otherwise,
MultiByteToWideChar returns an error.

Fixes: libuv#1135
Fixes: nodejs/node#9542
PR-URL: libuv#1139
Refs: libuv#889
Reviewed-By: Bartosz Sosnowski <[email protected]>
Reviewed-By: Ben Noordhuis <[email protected]>
Reviewed-By: Imran Iqbal <[email protected]>
  • Loading branch information
digitalinfinity authored and bnoordhuis committed Nov 15, 2016
1 parent 5f34766 commit d0c2641
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/win/tty.c
Original file line number Diff line number Diff line change
Expand Up @@ -1650,7 +1650,7 @@ static int uv_tty_write_bufs(uv_tty_t* handle,
uv_buf_t buf = bufs[i];
unsigned int j;

if (uv__vterm_state == UV_SUPPORTED) {
if (uv__vterm_state == UV_SUPPORTED && buf.len > 0) {
utf16_buf_used = MultiByteToWideChar(CP_UTF8,
0,
buf.base,
Expand Down
2 changes: 2 additions & 0 deletions test/test-list.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ TEST_DECLARE (semaphore_3)
TEST_DECLARE (tty)
#ifdef _WIN32
TEST_DECLARE (tty_raw)
TEST_DECLARE (tty_empty_write)
#endif
TEST_DECLARE (tty_file)
TEST_DECLARE (tty_pty)
Expand Down Expand Up @@ -404,6 +405,7 @@ TASK_LIST_START
TEST_ENTRY (tty)
#ifdef _WIN32
TEST_ENTRY (tty_raw)
TEST_ENTRY (tty_empty_write)
#endif
TEST_ENTRY (tty_file)
TEST_ENTRY (tty_pty)
Expand Down
42 changes: 42 additions & 0 deletions test/test-tty.c
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,48 @@ TEST_IMPL(tty_raw) {
MAKE_VALGRIND_HAPPY();
return 0;
}

TEST_IMPL(tty_empty_write) {
int r;
int ttyout_fd;
uv_tty_t tty_out;
uv_loop_t* loop = uv_default_loop();

/* Make sure we have an FD that refers to a tty */
HANDLE handle;

handle = CreateFileA("conout$",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
ASSERT(handle != INVALID_HANDLE_VALUE);
ttyout_fd = _open_osfhandle((intptr_t) handle, 0);

ASSERT(ttyout_fd >= 0);

ASSERT(UV_TTY == uv_guess_handle(ttyout_fd));

r = uv_tty_init(uv_default_loop(), &tty_out, ttyout_fd, 0); /* Writable. */
ASSERT(r == 0);

char dummy[1];
uv_buf_t bufs[1];
bufs[0].len = 0;
bufs[0].base = &dummy;

r = uv_try_write((uv_stream_t*) &tty_out, bufs, 1);
ASSERT(r == 0);

uv_close((uv_handle_t*) &tty_out, NULL);

uv_run(loop, UV_RUN_DEFAULT);

MAKE_VALGRIND_HAPPY();
return 0;
}
#endif


Expand Down

0 comments on commit d0c2641

Please sign in to comment.