mirror of
https://github.com/gogrlx/nats-server.git
synced 2026-04-17 03:24:40 -07:00
Added check for invalid subjects to Insert
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
package sublist
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
@@ -76,6 +77,10 @@ var (
|
||||
_SEP = byte('.')
|
||||
)
|
||||
|
||||
var (
|
||||
ErrInvalidSubject = errors.New("Invalid Subject")
|
||||
)
|
||||
|
||||
// split will split a subject into tokens
|
||||
func split(subject []byte, tokens [][]byte) [][]byte {
|
||||
start := 0
|
||||
@@ -88,20 +93,26 @@ func split(subject []byte, tokens [][]byte) [][]byte {
|
||||
return append(tokens, subject[start:])
|
||||
}
|
||||
|
||||
func (s *Sublist) Insert(subject []byte, sub interface{}) {
|
||||
func (s *Sublist) Insert(subject []byte, sub interface{}) error {
|
||||
tsa := [16][]byte{}
|
||||
toks := split(subject, tsa[:0])
|
||||
|
||||
s.mu.Lock()
|
||||
sfwc := false
|
||||
l := s.root
|
||||
var n *node
|
||||
|
||||
for _, t := range toks {
|
||||
if len(t) == 0 || sfwc {
|
||||
s.mu.Unlock()
|
||||
return ErrInvalidSubject
|
||||
}
|
||||
switch t[0] {
|
||||
case _PWC:
|
||||
n = l.pwc
|
||||
case _FWC:
|
||||
n = l.fwc
|
||||
sfwc = true
|
||||
default:
|
||||
if v := l.nodes.Get(t); v == nil {
|
||||
n = nil
|
||||
@@ -130,6 +141,7 @@ func (s *Sublist) Insert(subject []byte, sub interface{}) {
|
||||
s.stats.inserts++
|
||||
s.addToCache(subject, sub)
|
||||
s.mu.Unlock()
|
||||
return nil
|
||||
}
|
||||
|
||||
// addToCache will add the new entry to existing cache
|
||||
|
||||
@@ -173,6 +173,33 @@ func TestRemoveCleanupWildcards(t *testing.T) {
|
||||
verifyNumLevels(s, 0, t)
|
||||
}
|
||||
|
||||
func TestMalformedSubjects(t *testing.T) {
|
||||
s := New()
|
||||
|
||||
// beginning empty token
|
||||
if err := s.Insert([]byte(".foo"), '@'); err != ErrInvalidSubject {
|
||||
t.Fatal("Expected invalid subject error")
|
||||
}
|
||||
|
||||
// trailing empty token
|
||||
if err := s.Insert([]byte("foo."), '@'); err != ErrInvalidSubject {
|
||||
t.Fatal("Expected invalid subject error")
|
||||
}
|
||||
// empty middle token
|
||||
if err := s.Insert([]byte("foo..bar"), '@'); err != ErrInvalidSubject {
|
||||
t.Fatal("Expected invalid subject error")
|
||||
}
|
||||
// empty middle token #2
|
||||
if err := s.Insert([]byte("foo.bar..baz"), '@'); err != ErrInvalidSubject {
|
||||
t.Fatal("Expected invalid subject error")
|
||||
}
|
||||
// fwc not terminal
|
||||
if err := s.Insert([]byte("foo.>.bar"), '@'); err != ErrInvalidSubject {
|
||||
t.Fatal("Expected invalid subject error")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func TestCacheBehavior(t *testing.T) {
|
||||
s := New()
|
||||
literal := []byte("a.b.c")
|
||||
|
||||
Reference in New Issue
Block a user