From 38e6235235a556dfa28175b541a3cd42b480a319 Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 9 Oct 2015 23:52:23 +0000 Subject: udpsocket.c: memory leaks * ext/socket/udpsocket.c (udp_connect, udp_bind, udp_send): fix memory leaks at closed socket. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52097 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ ext/socket/udpsocket.c | 6 +++--- test/socket/test_udp.rb | 27 +++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 320be03fa8..ed73f24719 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sat Oct 10 08:52:21 2015 Nobuyoshi Nakada + + * ext/socket/udpsocket.c (udp_connect, udp_bind, udp_send): fix + memory leaks at closed socket. + Fri Oct 9 17:29:07 2015 Shugo Maeda * lib/net/ftp.rb (parse257): refactor. diff --git a/ext/socket/udpsocket.c b/ext/socket/udpsocket.c index 85b4e6a96d..bbd588ae02 100644 --- a/ext/socket/udpsocket.c +++ b/ext/socket/udpsocket.c @@ -84,8 +84,8 @@ udp_connect(VALUE sock, VALUE host, VALUE port) struct udp_arg arg; VALUE ret; - arg.res = rsock_addrinfo(host, port, SOCK_DGRAM, 0); GetOpenFile(sock, fptr); + arg.res = rsock_addrinfo(host, port, SOCK_DGRAM, 0); arg.fd = fptr->fd; ret = rb_ensure(udp_connect_internal, (VALUE)&arg, rsock_freeaddrinfo, (VALUE)arg.res); @@ -112,8 +112,8 @@ udp_bind(VALUE sock, VALUE host, VALUE port) struct rb_addrinfo *res0; struct addrinfo *res; - res0 = rsock_addrinfo(host, port, SOCK_DGRAM, 0); GetOpenFile(sock, fptr); + res0 = rsock_addrinfo(host, port, SOCK_DGRAM, 0); for (res = res0->ai; res; res = res->ai_next) { if (bind(fptr->fd, res->ai_addr, res->ai_addrlen) < 0) { continue; @@ -166,8 +166,8 @@ udp_send(int argc, VALUE *argv, VALUE sock) rb_scan_args(argc, argv, "4", &arg.mesg, &flags, &host, &port); StringValue(arg.mesg); - res0 = rsock_addrinfo(host, port, SOCK_DGRAM, 0); GetOpenFile(sock, fptr); + res0 = rsock_addrinfo(host, port, SOCK_DGRAM, 0); arg.fd = fptr->fd; arg.flags = NUM2INT(flags); for (res = res0->ai; res; res = res->ai_next) { diff --git a/test/socket/test_udp.rb b/test/socket/test_udp.rb index 7d28ec2628..56933375d7 100644 --- a/test/socket/test_udp.rb +++ b/test/socket/test_udp.rb @@ -69,4 +69,31 @@ class TestSocket_UDPSocket < Test::Unit::TestCase ensure u.close if u end + + def test_bind_no_memory_leak + assert_no_memory_leak(["-rsocket"], <<-"end;", <<-"end;", rss: true) + s = UDPSocket.new + s.close + end; + 100_000.times {begin s.bind("127.0.0.1", 1) rescue IOError; end} + end; + end + + def test_connect_no_memory_leak + assert_no_memory_leak(["-rsocket"], <<-"end;", <<-"end;", rss: true) + s = UDPSocket.new + s.close + end; + 100_000.times {begin s.connect("127.0.0.1", 1) rescue IOError; end} + end; + end + + def test_send_no_memory_leak + assert_no_memory_leak(["-rsocket"], <<-"end;", <<-"end;", rss: true) + s = UDPSocket.new + s.close + end; + 100_000.times {begin s.send("\0"*100, 0, "127.0.0.1", 1) rescue IOError; end} + end; + end end if defined?(UDPSocket) -- cgit v1.2.3