[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [snowflake/main] Fix leak in server acceptLoop
commit 53a2365696d144921eae57c790083e502628135d
Author: Cecylia Bocovich <cohosh@xxxxxxxxxxxxxx>
Date: Thu Jun 24 09:33:19 2021 -0400
Fix leak in server acceptLoop
Refactor out a separate handleStream function and ensure that all
connections are closed and the references are out of scope.
---
server/server.go | 34 ++++++++++++++++++++++------------
1 file changed, 22 insertions(+), 12 deletions(-)
diff --git a/server/server.go b/server/server.go
index b61d5b4..92d819f 100644
--- a/server/server.go
+++ b/server/server.go
@@ -41,7 +41,7 @@ additional HTTP listener on port 80 to work with ACME.
flag.PrintDefaults()
}
-// Copy from one stream to another.
+//proxy copies data bidirectionally from one connection to another.
func proxy(local *net.TCPConn, conn net.Conn) {
var wg sync.WaitGroup
wg.Add(2)
@@ -66,6 +66,20 @@ func proxy(local *net.TCPConn, conn net.Conn) {
wg.Wait()
}
+//handleConn bidirectionally connects a client snowflake connection with an ORPort.
+func handleConn(conn net.Conn) error {
+ addr := conn.RemoteAddr().String()
+ statsChannel <- addr != ""
+ or, err := pt.DialOr(&ptInfo, addr, ptMethodName)
+ if err != nil {
+ return fmt.Errorf("failed to connect to ORPort: %s", err)
+ }
+ defer or.Close()
+ proxy(or, conn)
+ return nil
+}
+
+//acceptLoop accepts incoming client snowflake connection and passes them to a handler function.
func acceptLoop(ln net.Listener) {
for {
conn, err := ln.Accept()
@@ -76,17 +90,13 @@ func acceptLoop(ln net.Listener) {
log.Printf("Snowflake accept error: %s", err)
break
}
- defer conn.Close()
-
- addr := conn.RemoteAddr().String()
- statsChannel <- addr != ""
- or, err := pt.DialOr(&ptInfo, addr, ptMethodName)
- if err != nil {
- log.Printf("failed to connect to ORPort: %s", err)
- continue
- }
- defer or.Close()
- go proxy(or, conn)
+ go func() {
+ defer conn.Close()
+ err := handleConn(conn)
+ if err != nil {
+ log.Printf("handleConn: %v", err)
+ }
+ }()
}
}
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits