VOL-4394 Panic occurs when an ID is requested from an exhausted resource pool
Change-Id: Ie5710a50b550ec0c41bb1609e58f8f90ebd2830d
diff --git a/pkg/ponresourcemanager/ponresourcemanager.go b/pkg/ponresourcemanager/ponresourcemanager.go
index ba67aeb..e7e8401 100755
--- a/pkg/ponresourcemanager/ponresourcemanager.go
+++ b/pkg/ponresourcemanager/ponresourcemanager.go
@@ -1257,12 +1257,10 @@
*/
ByteArray, err := ToByte(Resource[POOL])
if err != nil {
- logger.Error(ctx, "Failed to convert resource to byte array")
return 0, err
}
Data := bitmap.TSFromData(ByteArray, false)
if Data == nil {
- logger.Error(ctx, "Failed to get data from byte array")
return 0, errors.New("Failed to get data from byte array")
}
@@ -1273,6 +1271,9 @@
break
}
}
+ if Idx == Len {
+ return 0, errors.New("resource-exhausted--no-free-id-in-the-pool")
+ }
Data.Set(Idx, true)
res := uint32(Resource[START_IDX].(float64))
Resource[POOL] = Data.Data(false)
@@ -1297,6 +1298,10 @@
return false
}
Idx := Id - uint32(Resource[START_IDX].(float64))
+ if Idx >= uint32(Data.Len()) {
+ logger.Errorf(ctx, "ID %d is out of the boundaries of the pool", Id)
+ return false
+ }
Data.Set(int(Idx), false)
Resource[POOL] = Data.Data(false)
@@ -1314,6 +1319,10 @@
return false
}
Idx := Id - StartIndex
+ if Idx >= uint32(Data.Len()) {
+ logger.Errorf(ctx, "Reservation failed. ID %d is out of the boundaries of the pool", Id)
+ return false
+ }
Data.Set(int(Idx), true)
return true
}