Added check for invalid subjects to Insert

This commit is contained in:
Derek Collison
2012-11-29 17:21:21 -08:00
parent 56cfcac374
commit 1928a2792a
2 changed files with 40 additions and 1 deletions

View File

@@ -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

View File

@@ -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")