From 90e36bcc76d05577a3b76113d6ab0acb2f9f3193 Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Mon, 30 Dec 2019 18:18:27 +0800 Subject: [PATCH 1/2] =?UTF-8?q?networks:=20newIfnameHint:=20=E5=8F=AF?= =?UTF-8?q?=E8=AF=BB=E6=80=A7=E6=94=B9=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/models/guestnetworks.go | 3 +++ pkg/compute/models/networks.go | 20 +++++++++++--------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/pkg/compute/models/guestnetworks.go b/pkg/compute/models/guestnetworks.go index cc8892fca4..d56fb9562f 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 ) 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 } From a592649ae12e5f42c824d607ad223d2847ff4aea Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Tue, 31 Dec 2019 10:00:26 +0800 Subject: [PATCH 2/2] =?UTF-8?q?guestnetworks:=20=E5=8A=A0=E5=BC=BAifname?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/models/guestnetworks.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/pkg/compute/models/guestnetworks.go b/pkg/compute/models/guestnetworks.go index d56fb9562f..c18c0ee961 100644 --- a/pkg/compute/models/guestnetworks.go +++ b/pkg/compute/models/guestnetworks.go @@ -257,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"))