From 34b5a11e20baa36c71b95597f88cbcac73a9c1eb Mon Sep 17 00:00:00 2001 From: "R.I.Pienaar" Date: Mon, 20 Sep 2021 17:34:48 +0200 Subject: [PATCH] protect against negative dupe window via negative max age Signed-off-by: R.I.Pienaar --- server/jetstream_test.go | 33 +++++++++++++++++++++++++++++++++ server/stream.go | 3 ++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/server/jetstream_test.go b/server/jetstream_test.go index 7645e230..469acce3 100644 --- a/server/jetstream_test.go +++ b/server/jetstream_test.go @@ -13094,6 +13094,39 @@ func TestJetStreamPullLargeBatchExpired(t *testing.T) { } } +func TestNegativeDupeWindow(t *testing.T) { + s := RunBasicJetStreamServer() + defer s.Shutdown() + + config := s.JetStreamConfig() + if config != nil { + defer removeDir(t, config.StoreDir) + } + + nc, js := jsClientConnect(t, s) + defer nc.Close() + + // we incorrectly set MaxAge to -1 which then as a side effect sets dupe window to -1 which should fail + _, err := js.AddStream(&nats.StreamConfig{ + Name: "TEST", + Subjects: nil, + Retention: nats.WorkQueuePolicy, + MaxConsumers: 1, + MaxMsgs: -1, + MaxBytes: -1, + Discard: nats.DiscardNew, + MaxAge: -1, + MaxMsgsPerSubject: -1, + MaxMsgSize: -1, + Storage: nats.FileStorage, + Replicas: 1, + NoAck: false, + }) + if err == nil || err.Error() != "duplicates window can not be negative" { + t.Fatalf("Expected dupe window error got: %v", err) + } +} + /////////////////////////////////////////////////////////////////////////// // Simple JetStream Benchmarks /////////////////////////////////////////////////////////////////////////// diff --git a/server/stream.go b/server/stream.go index 15671ab0..62c76a59 100644 --- a/server/stream.go +++ b/server/stream.go @@ -796,7 +796,8 @@ func checkStreamCfg(config *StreamConfig) (StreamConfig, error) { } else { cfg.Duplicates = StreamDefaultDuplicatesWindow } - } else if cfg.Duplicates < 0 { + } + if cfg.Duplicates < 0 { return StreamConfig{}, fmt.Errorf("duplicates window can not be negative") } // Check that duplicates is not larger then age if set.