summaryrefslogtreecommitdiffstats
path: root/script/git-daemon
diff options
context:
space:
mode:
authorJohan Sørensen <johan@johansorensen.com>2009-01-09 10:17:13 +0100
committerJohan Sørensen <johan@johansorensen.com>2009-01-09 10:20:13 +0100
commitddae231e59f9eec3557e34a9769abe8b012bccd8 (patch)
tree84b46beee49b4c3a984c479b65cab2249ae7b6c4 /script/git-daemon
parent70ecbba1c9ba4028df10cd09a29b49a877d9b1f2 (diff)
downloadgitorious-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-xscript/git-daemon15
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