dhcp4d: protect leases with a mutex

The HTTP handler runs in a separate goroutine.
This commit is contained in:
Michael Stapelberg 2020-01-31 18:23:19 +01:00
parent 73bd5c6a50
commit e76886dab4

View File

@ -27,6 +27,7 @@ import (
"os" "os"
"os/signal" "os/signal"
"sort" "sort"
"sync"
"syscall" "syscall"
"time" "time"
@ -68,7 +69,10 @@ func updateNonExpired(leases []*dhcp4d.Lease) {
var ouiDB = oui.NewDB("/perm/dhcp4d/oui") var ouiDB = oui.NewDB("/perm/dhcp4d/oui")
var leases []*dhcp4d.Lease var (
leasesMu sync.Mutex
leases []*dhcp4d.Lease
)
var ( var (
timefmt = func(t time.Time) string { timefmt = func(t time.Time) string {
@ -186,6 +190,8 @@ func loadLeases(h *dhcp4d.Handler, fn string) error {
return err return err
} }
leasesMu.Lock()
defer leasesMu.Unlock()
if err := json.Unmarshal(b, &leases); err != nil { if err := json.Unmarshal(b, &leases); err != nil {
return err return err
} }
@ -215,6 +221,8 @@ func loadLeases(h *dhcp4d.Handler, fn string) error {
Static bool Static bool
} }
leasesMu.Lock()
defer leasesMu.Unlock()
static := make([]tmplLease, 0, len(leases)) static := make([]tmplLease, 0, len(leases))
dynamic := make([]tmplLease, 0, len(leases)) dynamic := make([]tmplLease, 0, len(leases))
tl := func(l *dhcp4d.Lease) tmplLease { tl := func(l *dhcp4d.Lease) tmplLease {
@ -302,6 +310,8 @@ func logic() error {
return err return err
} }
handler.Leases = func(newLeases []*dhcp4d.Lease, latest *dhcp4d.Lease) { handler.Leases = func(newLeases []*dhcp4d.Lease, latest *dhcp4d.Lease) {
leasesMu.Lock()
defer leasesMu.Unlock()
leases = newLeases leases = newLeases
log.Printf("DHCPACK %+v", latest) log.Printf("DHCPACK %+v", latest)
b, err := json.Marshal(leases) b, err := json.Marshal(leases)