Skip to content

Commit a6d2e9b

Browse files
Merge pull request #75 from Amnesic-Systems/robustness-improvements
Improve robustness of networking subsystem.
2 parents 132fa3c + c51f5d3 commit a6d2e9b

5 files changed

Lines changed: 27 additions & 10 deletions

File tree

cmd/veil-proxy/main.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,19 @@ func acceptLoop(ctx context.Context, ln net.Listener, cfg *config.VeilProxy) {
113113
log.Printf("Started DNS forwarder at %s.", dns.UDPAddr())
114114
}
115115

116+
// Close vm and tunDev when the context is canceled to
117+
// unblock the forwarding goroutines before wg.Wait().
118+
stopCh := make(chan struct{})
119+
defer close(stopCh)
120+
go func() {
121+
select {
122+
case <-ctx.Done():
123+
_ = vm.Close()
124+
_ = tunDev.Close()
125+
case <-stopCh:
126+
}
127+
}()
128+
116129
var wg sync.WaitGroup
117130
wg.Add(2)
118131
go proxy.VSOCKToTun(vm, tunDev, ch, &wg)

internal/httpx/httpx.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@ func WaitForSvc(
9090
) (err error) {
9191
defer errs.Wrap(&err, "failed to wait for service")
9292

93-
start := time.Now()
9493
deadline, ok := ctx.Deadline()
9594
if !ok {
9695
return errors.New("context has no deadline")
@@ -110,7 +109,7 @@ func WaitForSvc(
110109
log.Print("Service is ready.")
111110
return nil
112111
}
113-
if time.Since(start) > deadline.Sub(start) {
112+
if time.Now().After(deadline) {
114113
return errDeadlineExceeded
115114
}
116115
time.Sleep(10 * time.Millisecond)

internal/net/proxy/proxy.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,18 @@ func TunToVSOCK(
2424
defer func() { _ = to.Close() }()
2525
defer wg.Done()
2626
var (
27-
err error
28-
pktLenBuf = make([]byte, lenBufSize)
29-
pktBuf = make([]byte, tun.MTU)
27+
err error
28+
sendBuf = make([]byte, lenBufSize+tun.MTU)
29+
pktBuf = sendBuf[lenBufSize:]
3030
)
3131

3232
for {
3333
// Read a network packet from the tun interface.
3434
nr, rerr := from.Read(pktBuf)
3535
if nr > 0 {
3636
// Forward the network packet to our TCP-over-VSOCK connection.
37-
binary.BigEndian.PutUint16(pktLenBuf, uint16(nr))
38-
if _, werr := to.Write(append(pktLenBuf, pktBuf[:nr]...)); werr != nil {
37+
binary.BigEndian.PutUint16(sendBuf, uint16(nr))
38+
if _, werr := to.Write(sendBuf[:lenBufSize+nr]); werr != nil {
3939
err = werr
4040
break
4141
}

internal/net/tun/tun_linux.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ func setupTun(typ int) (*os.File, error) {
4141
return nil, err
4242
}
4343
if err := configureTun(typ); err != nil {
44+
_ = fd.Close()
4445
return nil, err
4546
}
4647

internal/service/service.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"log"
1010
"net"
1111
"net/http"
12+
"time"
1213

1314
"github.com/Amnesic-Systems/veil/internal/addr"
1415
"github.com/Amnesic-Systems/veil/internal/config"
@@ -140,13 +141,16 @@ func startAllWebSrvs(
140141
}(extSrv)
141142

142143
// Wait until the context is canceled, at which point it's time to stop web
143-
// servers.
144+
// servers. Use a fresh context for Shutdown so active connections get a
145+
// chance to drain rather than being cut off immediately.
144146
<-ctx.Done()
145147
log.Print("Context cancelled; shutting down veil.")
146-
if err := intSrv.Shutdown(ctx); err != nil {
148+
shutdownCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
149+
defer cancel()
150+
if err := intSrv.Shutdown(shutdownCtx); err != nil {
147151
log.Printf("Error shutting down internal server: %v", err)
148152
}
149-
if err := extSrv.Shutdown(ctx); err != nil {
153+
if err := extSrv.Shutdown(shutdownCtx); err != nil {
150154
log.Printf("Error shutting down external server: %v", err)
151155
}
152156
}

0 commit comments

Comments
 (0)