dhcp4d: ensure that SetHostname operates on the correct lease (#64)
Previously SetHostname could operate on an expired lease, or even on a lease for a different hwaddr, if the lease for the correct hwaddr expired and the same lease ID was given away to someone else. That's though mostly a theoretical concern, given the actual usage of SetHostname and the time scales involved.
This commit is contained in:
parent
7f135438b8
commit
0507d93b3d
@ -279,7 +279,10 @@ func newSrv(permDir string) (*srv, error) {
|
|||||||
http.Error(w, "missing hostname parameter", http.StatusBadRequest)
|
http.Error(w, "missing hostname parameter", http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
handler.SetHostname(hwaddr, hostname)
|
if err := handler.SetHostname(hwaddr, hostname); err != nil {
|
||||||
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
http.Redirect(w, r, "/", http.StatusFound)
|
http.Redirect(w, r, "/", http.StatusFound)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@ package dhcp4d
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
@ -137,14 +138,18 @@ func (h *Handler) callLeasesLocked(lease *Lease) {
|
|||||||
h.Leases(leases, lease)
|
h.Leases(leases, lease)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handler) SetHostname(hwaddr, hostname string) {
|
func (h *Handler) SetHostname(hwaddr, hostname string) error {
|
||||||
h.leasesMu.Lock()
|
h.leasesMu.Lock()
|
||||||
defer h.leasesMu.Unlock()
|
defer h.leasesMu.Unlock()
|
||||||
leaseNum := h.leasesHW[hwaddr]
|
leaseNum := h.leasesHW[hwaddr]
|
||||||
lease := h.leasesIP[leaseNum]
|
lease := h.leasesIP[leaseNum]
|
||||||
|
if lease.HardwareAddr != hwaddr || lease.Expired(h.timeNow()) {
|
||||||
|
return fmt.Errorf("hwaddr %v does not have a valid lease", hwaddr)
|
||||||
|
}
|
||||||
lease.Hostname = hostname
|
lease.Hostname = hostname
|
||||||
lease.HostnameOverride = hostname
|
lease.HostnameOverride = hostname
|
||||||
h.callLeasesLocked(lease)
|
h.callLeasesLocked(lease)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handler) findLease() int {
|
func (h *Handler) findLease() int {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user