ソースを参照

Fix bitseq.SetAnyInRange

- size 1 range is a valid input

Signed-off-by: Alessandro Boch <aboch@docker.com>
Alessandro Boch 8 年 前
コミット
f43e4ec066
2 ファイル変更6 行追加5 行削除
  1. 1 1
      libnetwork/bitseq/sequence.go
  2. 5 4
      libnetwork/bitseq/sequence_test.go

+ 1 - 1
libnetwork/bitseq/sequence.go

@@ -197,7 +197,7 @@ func (h *Handle) getCopy() *Handle {
 
 // SetAnyInRange atomically sets the first unset bit in the specified range in the sequence and returns the corresponding ordinal
 func (h *Handle) SetAnyInRange(start, end uint64) (uint64, error) {
-	if end-start <= 0 || end >= h.bits {
+	if end < start || end >= h.bits {
 		return invalidPos, fmt.Errorf("invalid bit range [%d, %d]", start, end)
 	}
 	if h.Unselected() == 0 {

+ 5 - 4
libnetwork/bitseq/sequence_test.go

@@ -639,10 +639,6 @@ func TestSetInRange(t *testing.T) {
 		t.Fatalf("Expected failure. Got success with ordinal:%d", o)
 	}
 
-	if o, err := hnd.SetAnyInRange(5, 5); err == nil {
-		t.Fatalf("Expected failure. Got success with ordinal:%d", o)
-	}
-
 	if o, err := hnd.SetAnyInRange(0, numBits); err == nil {
 		t.Fatalf("Expected failure. Got success with ordinal:%d", o)
 	}
@@ -692,6 +688,11 @@ func TestSetInRange(t *testing.T) {
 		t.Fatalf("Unexpected failure: %v", err)
 	}
 
+	// set one bit using the set range with 1 bit size range
+	if _, err := hnd.SetAnyInRange(uint64(163*blockLen-1), uint64(163*blockLen-1)); err != nil {
+		t.Fatal(err)
+	}
+
 	// create a non multiple of 32 mask
 	hnd, err = NewHandle("", nil, "", 30)
 	if err != nil {