Sfoglia il codice sorgente

net/portmapper: fix invalid UPnP metric name

Fixes #9551

Signed-off-by: Andrew Dunham <[email protected]>
Change-Id: I06f3a15a668be621675be6cbc7e5bdcc006e8570
Andrew Dunham 2 anni fa
parent
commit
d31460f793
2 ha cambiato i file con 21 aggiunte e 1 eliminazioni
  1. 10 1
      net/portmapper/portmapper.go
  2. 11 0
      net/portmapper/portmapper_test.go

+ 10 - 1
net/portmapper/portmapper.go

@@ -1040,7 +1040,16 @@ func getUPnPErrorsMetric(code int) *clientmetric.Metric {
 		return mm
 	}
 
-	mm = clientmetric.NewCounter(fmt.Sprintf("portmap_upnp_errors_with_code_%d", code))
+	// Metric names cannot contain a hyphen, so we handle negative numbers
+	// by prefixing the name with a "minus_".
+	var codeStr string
+	if code < 0 {
+		codeStr = fmt.Sprintf("portmap_upnp_errors_with_code_minus_%d", -code)
+	} else {
+		codeStr = fmt.Sprintf("portmap_upnp_errors_with_code_%d", code)
+	}
+
+	mm = clientmetric.NewCounter(codeStr)
 	mak.Set(&metricUPnPErrorsByCode, code, mm)
 	return mm
 }

+ 11 - 0
net/portmapper/portmapper_test.go

@@ -124,3 +124,14 @@ func TestPCPIntegration(t *testing.T) {
 		t.Errorf("got nil mapping after successful createOrGetMapping")
 	}
 }
+
+// Test to ensure that metric names generated by this function do not contain
+// invalid characters.
+//
+// See https://github.com/tailscale/tailscale/issues/9551
+func TestGetUPnPErrorsMetric(t *testing.T) {
+	// This will panic if the metric name is invalid.
+	getUPnPErrorsMetric(100)
+	getUPnPErrorsMetric(0)
+	getUPnPErrorsMetric(-100)
+}