Skip to content

Instantly share code, notes, and snippets.

@igorzi
Created March 1, 2012 20:13
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save igorzi/1952828 to your computer and use it in GitHub Desktop.
Save igorzi/1952828 to your computer and use it in GitHub Desktop.
From 6bbccf1fe0e000fd73e945368466cd27291483e3 Mon Sep 17 00:00:00 2001
From: Igor Zinkovsky <igorzi@microsoft.com>
Date: Thu, 1 Mar 2012 12:11:12 -0800
Subject: [PATCH] windows: return UV_ENOTSOCK when doing uv_pipe_connect to a
file
---
src/win/error.c | 1 +
src/win/pipe.c | 6 ++++++
test/test-list.h | 2 ++
test/test-pipe-connect-error.c | 27 +++++++++++++++++++++++++++
4 files changed, 36 insertions(+), 0 deletions(-)
diff --git a/src/win/error.c b/src/win/error.c
index 1922f20..851d272 100644
--- a/src/win/error.c
+++ b/src/win/error.c
@@ -115,6 +115,7 @@ uv_err_code uv_translate_sys_error(int sys_errno) {
case ERROR_SEM_TIMEOUT: return UV_ETIMEDOUT;
case WSAETIMEDOUT: return UV_ETIMEDOUT;
case WSAHOST_NOT_FOUND: return UV_ENOENT;
+ case WSAENOTSOCK: return UV_ENOTSOCK;
default: return UV_UNKNOWN;
}
}
diff --git a/src/win/pipe.c b/src/win/pipe.c
index ae769c1..54d90e0 100644
--- a/src/win/pipe.c
+++ b/src/win/pipe.c
@@ -560,6 +560,12 @@ void uv_pipe_connect(uv_connect_t* req, uv_pipe_t* handle,
assert(handle->handle != INVALID_HANDLE_VALUE);
+ /* Ensure that what we just opened is actually a pipe */
+ if (!GetNamedPipeInfo(handle->handle, NULL, NULL, NULL, NULL)) {
+ errno = WSAENOTSOCK;
+ goto error;
+ }
+
if (uv_set_pipe_handle(loop, (uv_pipe_t*)req->handle, handle->handle)) {
errno = GetLastError();
goto error;
diff --git a/test/test-list.h b/test/test-list.h
index 99932da..2997b17 100644
--- a/test/test-list.h
+++ b/test/test-list.h
@@ -58,6 +58,7 @@ TEST_DECLARE (pipe_bind_error_addrnotavail)
TEST_DECLARE (pipe_bind_error_inval)
TEST_DECLARE (pipe_listen_without_bind)
TEST_DECLARE (pipe_connect_bad_name)
+TEST_DECLARE (pipe_connect_to_file)
TEST_DECLARE (connection_fail)
TEST_DECLARE (connection_fail_doesnt_auto_close)
TEST_DECLARE (shutdown_eof)
@@ -159,6 +160,7 @@ TASK_LIST_START
TEST_OUTPUT_ENTRY (platform_output)
TEST_ENTRY (pipe_connect_bad_name)
+ TEST_ENTRY (pipe_connect_to_file)
TEST_ENTRY (tty)
TEST_ENTRY (stdio_over_pipes)
diff --git a/test/test-pipe-connect-error.c b/test/test-pipe-connect-error.c
index 2faa446..97734ca 100644
--- a/test/test-pipe-connect-error.c
+++ b/test/test-pipe-connect-error.c
@@ -50,6 +50,14 @@ static void connect_cb(uv_connect_t* connect_req, int status) {
}
+static void connect_cb_file(uv_connect_t* connect_req, int status) {
+ ASSERT(status == -1);
+ ASSERT(uv_last_error(uv_default_loop()).code == UV_ENOTSOCK);
+ uv_close((uv_handle_t*)connect_req->handle, close_cb);
+ connect_cb_called++;
+}
+
+
TEST_IMPL(pipe_connect_bad_name) {
uv_pipe_t client;
uv_connect_t req;
@@ -66,3 +74,22 @@ TEST_IMPL(pipe_connect_bad_name) {
return 0;
}
+
+
+TEST_IMPL(pipe_connect_to_file) {
+ const char* path = "test/fixtures/empty_file";
+ uv_pipe_t client;
+ uv_connect_t req;
+ int r;
+
+ r = uv_pipe_init(uv_default_loop(), &client, 0);
+ ASSERT(r == 0);
+ uv_pipe_connect(&req, &client, path, connect_cb_file);
+
+ uv_run(uv_default_loop());
+
+ ASSERT(close_cb_called == 1);
+ ASSERT(connect_cb_called == 1);
+
+ return 0;
+}
\ No newline at end of file
--
1.7.9.msysgit.0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment