From eb9f446ebf64dde94f69daa5cdbc2d84ce68eb4d Mon Sep 17 00:00:00 2001 From: akr Date: Wed, 28 May 2014 15:42:09 +0000 Subject: * ext/socket/unixsocket.c (rsock_init_unixsock): Open a socket after path length check. This fixes a fd leak by TestSocket_UNIXSocket#test_too_long_path. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46218 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/socket/unixsocket.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'ext') diff --git a/ext/socket/unixsocket.c b/ext/socket/unixsocket.c index 519343b558..0a1b65a5b9 100644 --- a/ext/socket/unixsocket.c +++ b/ext/socket/unixsocket.c @@ -34,10 +34,6 @@ rsock_init_unixsock(VALUE sock, VALUE path, int server) rb_io_t *fptr; SafeStringValue(path); - fd = rsock_socket(AF_UNIX, SOCK_STREAM, 0); - if (fd < 0) { - rsock_sys_fail_path("socket(2)", path); - } INIT_SOCKADDR_UN(&sockaddr, sizeof(struct sockaddr_un)); if (sizeof(sockaddr.sun_path) < (size_t)RSTRING_LEN(path)) { @@ -47,6 +43,11 @@ rsock_init_unixsock(VALUE sock, VALUE path, int server) memcpy(sockaddr.sun_path, RSTRING_PTR(path), RSTRING_LEN(path)); sockaddrlen = rsock_unix_sockaddr_len(path); + fd = rsock_socket(AF_UNIX, SOCK_STREAM, 0); + if (fd < 0) { + rsock_sys_fail_path("socket(2)", path); + } + if (server) { status = bind(fd, (struct sockaddr*)&sockaddr, sockaddrlen); } -- cgit v1.2.3