From a1ed445b812d8aa335700c0bda5e3bd70cc33d20 Mon Sep 17 00:00:00 2001 From: shugo Date: Tue, 29 Jan 2013 00:32:05 +0000 Subject: [PATCH] * ext/socket/socket.c (sock_s_pack_sockaddr_un): calculate the correct address length of an abstract socket. * test/socket/test_unix.rb: related test. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38963 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ ext/socket/socket.c | 2 +- test/socket/test_unix.rb | 10 ++++++---- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0a997ff3e4..6c85258b32 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Tue Jan 29 09:26:20 2013 Shugo Maeda + + * ext/socket/socket.c (sock_s_pack_sockaddr_un): calculate the + correct address length of an abstract socket. + + * test/socket/test_unix.rb: related test. + Mon Jan 28 18:02:16 2013 Nobuyoshi Nakada * vm_backtrace.c (rb_debug_inspector_frame_{class,binding,iseq}_get): diff --git a/ext/socket/socket.c b/ext/socket/socket.c index 09c22d6d69..6900dbcca6 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -1430,7 +1430,7 @@ sock_s_pack_sockaddr_un(VALUE self, VALUE path) (size_t)RSTRING_LEN(path), sizeof(sockaddr.sun_path)); } memcpy(sockaddr.sun_path, RSTRING_PTR(path), RSTRING_LEN(path)); - addr = rb_str_new((char*)&sockaddr, sizeof(sockaddr)); + addr = rb_str_new((char*)&sockaddr, rsock_unix_sockaddr_len(path)); OBJ_INFECT(addr, path); return addr; diff --git a/test/socket/test_unix.rb b/test/socket/test_unix.rb index a44ef2de38..90f641efe5 100644 --- a/test/socket/test_unix.rb +++ b/test/socket/test_unix.rb @@ -339,10 +339,12 @@ class TestSocket_UNIXSocket < Test::Unit::TestCase assert_raise(ArgumentError) { UNIXServer.new("a" * 300) } end - #def test_nul - # # path may contain NULs for abstract unix sockets. [ruby-core:10288] - # assert_raise(ArgumentError) { Socket.sockaddr_un("a\0b") } - #end + def test_abstract_namespace + return if /linux/ !~ RUBY_PLATFORM + addr = Socket.pack_sockaddr_un("\0foo") + assert_match(/\0foo\z/, addr) + assert_equal("\0foo", Socket.unpack_sockaddr_un(addr)) + end def test_dgram_pair s1, s2 = UNIXSocket.pair(Socket::SOCK_DGRAM)