#121: Remove defer from for loops

Fixes #121. `defer` in for loops can possibly lead to leaks.

The whole handling including the defer are now moved into anonymous functions outside the for loop and are called form the loop instead. This way the defer is handle when the inline function finishes
This commit is contained in:
Winni Neessen 2023-03-15 18:42:25 +01:00
parent cb9bec4a6f
commit 13d0add21c
Signed by: wneessen
GPG key ID: 5F3AF39B820C119D

View file

@ -808,13 +808,7 @@ func TestHello(t *testing.T) {
t.Fatalf("Hello server and client size mismatch") t.Fatalf("Hello server and client size mismatch")
} }
for i := 0; i < len(helloServer); i++ { tf := func(fake faker, i int) error {
server := strings.Join(strings.Split(baseHelloServer+helloServer[i], "\n"), "\r\n")
client := strings.Join(strings.Split(baseHelloClient+helloClient[i], "\n"), "\r\n")
var cmdbuf strings.Builder
bcmdbuf := bufio.NewWriter(&cmdbuf)
var fake faker
fake.ReadWriter = bufio.NewReadWriter(bufio.NewReader(strings.NewReader(server)), bcmdbuf)
c, err := NewClient(fake, "fake.host") c, err := NewClient(fake, "fake.host")
if err != nil { if err != nil {
t.Fatalf("NewClient: %v", err) t.Fatalf("NewClient: %v", err)
@ -871,6 +865,20 @@ func TestHello(t *testing.T) {
if err != nil { if err != nil {
t.Errorf("Command %d failed: %v", i, err) t.Errorf("Command %d failed: %v", i, err)
} }
return nil
}
for i := 0; i < len(helloServer); i++ {
server := strings.Join(strings.Split(baseHelloServer+helloServer[i], "\n"), "\r\n")
client := strings.Join(strings.Split(baseHelloClient+helloClient[i], "\n"), "\r\n")
var cmdbuf strings.Builder
bcmdbuf := bufio.NewWriter(&cmdbuf)
var fake faker
fake.ReadWriter = bufio.NewReadWriter(bufio.NewReader(strings.NewReader(server)), bcmdbuf)
if err := tf(fake, i); err != nil {
t.Error(err)
}
if err := bcmdbuf.Flush(); err != nil { if err := bcmdbuf.Flush(); err != nil {
t.Errorf("flush failed: %s", err) t.Errorf("flush failed: %s", err)
@ -1241,6 +1249,13 @@ func serverHandle(c net.Conn, t *testing.T) error {
send := smtpSender{c}.send send := smtpSender{c}.send
send("220 127.0.0.1 ESMTP service ready") send("220 127.0.0.1 ESMTP service ready")
s := bufio.NewScanner(c) s := bufio.NewScanner(c)
tf := func(config *tls.Config) error {
c = tls.Server(c, config)
defer func() {
_ = c.Close()
}()
return serverHandleTLS(c, t)
}
for s.Scan() { for s.Scan() {
switch s.Text() { switch s.Text() {
case "EHLO localhost": case "EHLO localhost":
@ -1254,11 +1269,7 @@ func serverHandle(c net.Conn, t *testing.T) error {
return err return err
} }
config := &tls.Config{Certificates: []tls.Certificate{keypair}} config := &tls.Config{Certificates: []tls.Certificate{keypair}}
c = tls.Server(c, config) return tf(config)
defer func() {
_ = c.Close()
}()
return serverHandleTLS(c, t)
default: default:
t.Fatalf("unrecognized command: %q", s.Text()) t.Fatalf("unrecognized command: %q", s.Text())
} }