diff options
author | Johan Sørensen <johan@johansorensen.com> | 2009-01-09 10:17:13 +0100 |
---|---|---|
committer | Johan Sørensen <johan@johansorensen.com> | 2009-01-09 10:20:13 +0100 |
commit | ddae231e59f9eec3557e34a9769abe8b012bccd8 (patch) | |
tree | 84b46beee49b4c3a984c479b65cab2249ae7b6c4 /script/git-daemon | |
parent | 70ecbba1c9ba4028df10cd09a29b49a877d9b1f2 (diff) | |
download | gitorious-mainline-outdated-ddae231e59f9eec3557e34a9769abe8b012bccd8.zip gitorious-mainline-outdated-ddae231e59f9eec3557e34a9769abe8b012bccd8.tar.gz gitorious-mainline-outdated-ddae231e59f9eec3557e34a9769abe8b012bccd8.tar.bz2 |
Don't leak sockets when we fork in the ruby git-daemon
Diffstat (limited to 'script/git-daemon')
-rwxr-xr-x | script/git-daemon | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/script/git-daemon b/script/git-daemon index ab14709..c4b3350 100755 --- a/script/git-daemon +++ b/script/git-daemon @@ -4,6 +4,7 @@ require 'rubygems' require 'daemons' require 'geoip' require 'socket' +require 'fcntl' require "optparse" ENV["RAILS_ENV"] ||= "production" @@ -39,6 +40,7 @@ module Git end end @socket = TCPServer.new(@options[:host], @options[:port]) + @socket.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) log(Process.pid, "Listening on #{@options[:host]}:#{@options[:port]}...") run end @@ -85,8 +87,8 @@ module Git Dir.chdir(path) do cmd = "git-upload-pack --strict --timeout=#{TIMEOUT} ." - - fork do + + child_pid = fork do repository = nil begin @@ -97,9 +99,11 @@ module Git pid = Process.pid log(pid, "Connection from #{ip} for #{path.inspect}") - + $stdout.reopen(session) $stdin.reopen(session) + $stderr.reopen("/dev/null") + session.close if repository @@ -113,8 +117,8 @@ module Git else log(pid, "Cannot find repository: #{path}") end - log(Process.pid, "Deferred in #{'%0.5f' % (Time.now - start_time)}s") + log(Process.pid, "Deferred in #{'%0.5f' % (Time.now - start_time)}s") exec(cmd) # FIXME; we don't ever get here since we exec(), so reaped count may be incorrect $children_reaped += 1 @@ -123,12 +127,13 @@ module Git end rescue Errno::EAGAIN else $stderr.puts "Invalid request from #{ip}: #{line}" - session.close $children_active -= 1 end + session.close end def handle_stop(signal) + @socket.close log(Process.pid, "Received #{signal}, exiting..") exit 0 end |