Browse Source

webdav: run path.Clean over a memLS' saved LockDetails.

Change-Id: I22d47bc4a07911a8c7c57a2db83f5c8ffe1c420c
Reviewed-on: https://go-review.googlesource.com/3565
Reviewed-by: Nick Cooper <nmvc@google.com>
Reviewed-by: Nigel Tao <nigeltao@golang.org>
Nigel Tao 11 years ago
parent
commit
5bde26037a
2 changed files with 24 additions and 3 deletions
  1. 3 3
      webdav/lock.go
  2. 21 0
      webdav/lock_test.go

+ 3 - 3
webdav/lock.go

@@ -163,12 +163,12 @@ func (m *memLS) Create(now time.Time, details LockDetails) (string, error) {
 	m.mu.Lock()
 	m.mu.Lock()
 	defer m.mu.Unlock()
 	defer m.mu.Unlock()
 	m.collectExpiredNodes(now)
 	m.collectExpiredNodes(now)
-	name := slashClean(details.Root)
+	details.Root = slashClean(details.Root)
 
 
-	if !m.canCreate(name, details.ZeroDepth) {
+	if !m.canCreate(details.Root, details.ZeroDepth) {
 		return "", ErrLocked
 		return "", ErrLocked
 	}
 	}
-	n := m.create(name)
+	n := m.create(details.Root)
 	n.token = m.nextToken()
 	n.token = m.nextToken()
 	m.byToken[n.token] = n
 	m.byToken[n.token] = n
 	n.details = details
 	n.details = details

+ 21 - 0
webdav/lock_test.go

@@ -155,6 +155,27 @@ func TestMemLSCanCreate(t *testing.T) {
 	check(0, "/")
 	check(0, "/")
 }
 }
 
 
+func TestMemLSNonCanonicalRoot(t *testing.T) {
+	now := time.Unix(0, 0)
+	m := NewMemLS().(*memLS)
+	token, err := m.Create(now, LockDetails{
+		Root:     "/foo/./bar//",
+		Duration: 1 * time.Second,
+	})
+	if err != nil {
+		t.Fatalf("Create: %v", err)
+	}
+	if err := m.consistent(); err != nil {
+		t.Fatalf("Create: inconsistent state: %v", err)
+	}
+	if err := m.Unlock(now, token); err != nil {
+		t.Fatalf("Unlock: %v", err)
+	}
+	if err := m.consistent(); err != nil {
+		t.Fatalf("Unlock: inconsistent state: %v", err)
+	}
+}
+
 func TestMemLSExpiry(t *testing.T) {
 func TestMemLSExpiry(t *testing.T) {
 	m := NewMemLS().(*memLS)
 	m := NewMemLS().(*memLS)
 	testCases := []string{
 	testCases := []string{