m/pkg/socksproxy: fix fd leak

Change-Id: I4e5f9e937b85a46a9c4ee2e79f4bdcea06858d59
Reviewed-on: https://review.monogon.dev/c/monogon/+/1386
Reviewed-by: Lorenz Brun <lorenz@monogon.tech>
Tested-by: Jenkins CI
diff --git a/metropolis/pkg/socksproxy/socksproxy.go b/metropolis/pkg/socksproxy/socksproxy.go
index ce35cec..dfd32c4 100644
--- a/metropolis/pkg/socksproxy/socksproxy.go
+++ b/metropolis/pkg/socksproxy/socksproxy.go
@@ -59,9 +59,9 @@
 	// default value (ReplySucceeded).
 	Error Reply
 
-	// Backend is the ReadWriter that will be bridged over to the connecting client
-	// if no Error is set.
-	Backend io.ReadWriter
+	// Backend is the ReadWriteCloser that will be bridged over to the connecting
+	// client if no Error is set.
+	Backend io.ReadWriteCloser
 	// LocalAddress is the IP address that is returned to the client as the local
 	// address of the newly established backend connection.
 	LocalAddress net.IP
@@ -213,6 +213,10 @@
 	}
 
 	// Pipe returned backend into connection.
-	go io.Copy(conRes.Backend, con)
+	go func() {
+		io.Copy(conRes.Backend, con)
+		conRes.Backend.Close()
+	}()
 	io.Copy(con, conRes.Backend)
+	conRes.Backend.Close()
 }