diff --git a/internal/pkg/report/reporter.go b/internal/pkg/report/reporter.go index f25790bd..72cc2b4f 100644 --- a/internal/pkg/report/reporter.go +++ b/internal/pkg/report/reporter.go @@ -26,6 +26,12 @@ import ( "google.golang.org/protobuf/types/known/timestamppb" ) +// Size limits for the outputs reported to the server. +const ( + maxOutputKeyLen = 255 + maxOutputValueLen = 1024 * 1024 // 1 MiB +) + type Reporter struct { ctx context.Context cancel context.CancelFunc @@ -390,13 +396,15 @@ func (r *Reporter) SetOutputs(outputs map[string]string) { defer r.stateMu.Unlock() for k, v := range outputs { - if len(k) > 255 { - r.logf("ignore output because the key is too long: %q", k) + if l := len(k); l > maxOutputKeyLen { + log.Warnf("ignore output %q because the key is too long: %d > %d", k, l, maxOutputKeyLen) + r.logf("ignore output %q because the key is too long: %d > %d", k, l, maxOutputKeyLen) continue } - if l := len(v); l > 1024*1024 { - log.Println("ignore output because the value is too long:", k, l) - r.logf("ignore output because the value %q is too long: %d", k, l) + if l := len(v); l > maxOutputValueLen { + log.Warnf("ignore output %q because the value is too long: %d > %d", k, l, maxOutputValueLen) + r.logf("ignore output %q because the value is too long: %d > %d", k, l, maxOutputValueLen) + continue } if _, ok := r.outputs.Load(k); ok { continue diff --git a/internal/pkg/report/reporter_test.go b/internal/pkg/report/reporter_test.go index 65d097e6..06be9307 100644 --- a/internal/pkg/report/reporter_test.go +++ b/internal/pkg/report/reporter_test.go @@ -1020,11 +1020,24 @@ func TestReporter_SetOutputs(t *testing.T) { got, _ = r.outputs.Load("foo") assert.Equal(t, "bar", got) - // keys longer than 255 chars are dropped - longKey := strings.Repeat("k", 256) + // keys longer than maxOutputKeyLen are dropped + longKey := strings.Repeat("k", maxOutputKeyLen+1) r.SetOutputs(map[string]string{longKey: "v"}) _, ok = r.outputs.Load(longKey) assert.False(t, ok) + + // values longer than maxOutputValueLen are dropped + longValue := strings.Repeat("v", maxOutputValueLen+1) + r.SetOutputs(map[string]string{"big": longValue}) + _, ok = r.outputs.Load("big") + assert.False(t, ok) + + // a value at exactly the limit is still stored + maxValue := strings.Repeat("v", maxOutputValueLen) + r.SetOutputs(map[string]string{"atlimit": maxValue}) + got, ok = r.outputs.Load("atlimit") + require.True(t, ok) + assert.Len(t, got, maxOutputValueLen) } func TestReporter_EffectiveCloseTimeout(t *testing.T) {