diff --git a/pkg/compute/models/guestnetworks.go b/pkg/compute/models/guestnetworks.go index cc8892fca4..c18c0ee961 100644 --- a/pkg/compute/models/guestnetworks.go +++ b/pkg/compute/models/guestnetworks.go @@ -42,6 +42,9 @@ import ( const ( MAX_IFNAME_SIZE = 13 + MAX_HINT_LEN = MAX_IFNAME_SIZE - 4 // 9 + HINT_BASE_LEN = 6 // 6 + HINT_RAND_LEN = MAX_HINT_LEN - HINT_BASE_LEN // 3 MAX_GUESTNIC_TO_SAME_NETWORK = 2 ) @@ -254,6 +257,23 @@ func (man *SGuestnetworkManager) ifnameUsed(ifname string) bool { if ifname == "" { return true } + if len(ifname) > MAX_IFNAME_SIZE { + return true + } + isa := func(c byte) bool { + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') + } + if !isa(ifname[0]) { + return true + } + for i := range ifname[1:] { + c := ifname[i] + if isa(c) || c >= '0' || c <= '9' || c == '_' || c == '-' { + continue + } + return true + } + count, err := GuestnetworkManager.Query().Equals("ifname", ifname).CountWithError() if err != nil { panic(errors.Wrap(err, "query if ifname is used")) diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index 341154820b..d3b0a51339 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -1172,19 +1172,22 @@ func (manager *SNetworkManager) newIfnameHint(hint string) (string, error) { } sani := func(r string) string { if r != "" && !isa(r[0]) { - return "a" + r + r = "a" + r + } + if len(r) > MAX_HINT_LEN { + r = r[:MAX_HINT_LEN] } return r } - newHint := func(base string) (string, error) { - if len(base) > 8 { - base = base[:8] + rand := func(base string) (string, error) { + if len(base) > HINT_BASE_LEN { + base = base[:HINT_BASE_LEN] } for i := 0; i < 3; i++ { - r := base + rand.String(7) + r := sani(base + rand.String(HINT_RAND_LEN)) cnt, err := manager.Query().Equals("ifname_hint", r).CountWithError() if err == nil && cnt == 0 { - return sani(r), nil + return r, nil } } return "", fmt.Errorf("failed finding ifname hint after 3 tries") @@ -1200,13 +1203,12 @@ func (manager *SNetworkManager) newIfnameHint(hint string) (string, error) { r = sani(r) if len(r) < 3 { - return newHint(r) + return rand(r) } if cnt, err := manager.Query().Equals("ifname_hint", r).CountWithError(); err != nil { return "", err } else if cnt > 0 { - r, err := newHint(r) - return r, err + return rand(r) } return r, nil }