diff --git a/pkg/device/enflame/device.go b/pkg/device/enflame/device.go index 6d59773fde..f5343a1a85 100644 --- a/pkg/device/enflame/device.go +++ b/pkg/device/enflame/device.go @@ -391,20 +391,20 @@ func (enf *EnflameDevices) Fit(devices []*device.DeviceUsage, request device.Con reason[common.ModeNotFit]++ return false, tmpDevs, common.GenReason(reason, len(devices)) } - requiredSlice := int32(profile.Size) - if requiredSlice <= 0 { + if profile.Size <= 0 || profile.Size > math.MaxInt32 { reason[common.ModeNotFit]++ return false, tmpDevs, common.GenReason(reason, len(devices)) } - profileMemoryMiB := int32(profile.MemoryGB * 1024) - if profileMemoryMiB <= 0 { + if profile.MemoryGB <= 0 || profile.MemoryGB > math.MaxInt32/1024 { reason[common.ModeNotFit]++ return false, tmpDevs, common.GenReason(reason, len(devices)) } - profileCorePercent := int32(profile.CorePercent) - if profileCorePercent <= 0 { - profileCorePercent = 1 + if profile.CorePercent > math.MaxInt32 { + reason[common.ModeNotFit]++ + return false, tmpDevs, common.GenReason(reason, len(devices)) } + profileMemoryMiB := int32(profile.MemoryGB * 1024) + profileCorePercent := int32(profile.CorePercent) for i, v := range slices.Backward(devices) { dev := v klog.V(4).InfoS("scoring pod", "pod", klog.KObj(pod), "device", dev.ID, "Memreq", k.Memreq, "MemPercentagereq", k.MemPercentagereq, "Coresreq", k.Coresreq, "Nums", k.Nums, "device index", i) @@ -660,7 +660,6 @@ func parseDRSCapacity(raw any) (int32, error) { } } -// clampToInt32 bounds v to the int32 range instead of letting the cast wrap silently. func clampToInt32(v int) int32 { if v > math.MaxInt32 { return math.MaxInt32 diff --git a/pkg/device/enflame/device_test.go b/pkg/device/enflame/device_test.go index fb8f0a3984..cfa3e2e7cd 100644 --- a/pkg/device/enflame/device_test.go +++ b/pkg/device/enflame/device_test.go @@ -377,7 +377,6 @@ func TestAddResourceUsage_ClampsOnOverflow(t *testing.T) { assert.NilError(t, err) assert.Equal(t, n.Used, int32(math.MaxInt32)) - // A second oversized slice must saturate, not wrap negative. err = dev.AddResourceUsage(&corev1.Pod{}, n, ctr) assert.NilError(t, err) assert.Equal(t, n.Used, int32(math.MaxInt32)) @@ -421,3 +420,42 @@ func TestAddResourceUsage_ClampsOversizedSliceString(t *testing.T) { assert.NilError(t, err) assert.Equal(t, n.Used, int32(math.MaxInt32)) } + +func TestFit_OversizedProfileRejected(t *testing.T) { + dev := InitEnflameDevice(EnflameConfig{ResourceNameDRSGCU: "enflame.com/drs-gcu"}) + devices := []*device.DeviceUsage{ + { + ID: "node-a-enflame-drs-0", + Index: 0, + Count: 6, + Used: 0, + Totalmem: 40960, + Type: EnflameVGCUDevice, + CustomInfo: map[string]any{ + "minor": "0", + "index": "0", + "profiles": map[string]string{"4294967299g.4294967299gb": "0"}, + }, + }, + } + req := device.ContainerDeviceRequest{Nums: 1, Type: EnflameVGCUDevice, Memreq: 3, MemPercentagereq: 101} + fit, result, _ := dev.Fit(devices, req, &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Annotations: map[string]string{}}}, &device.NodeInfo{}, &device.PodDevices{}) + assert.Equal(t, fit, false) + assert.Equal(t, len(result[EnflameVGCUDevice]), 0) + + devices[0].CustomInfo["profiles"] = map[string]string{"4294967299g.20gb": "0"} + fit, result, _ = dev.Fit(devices, req, &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Annotations: map[string]string{}}}, &device.NodeInfo{}, &device.PodDevices{}) + assert.Equal(t, fit, false) + assert.Equal(t, len(result[EnflameVGCUDevice]), 0) + + devices[0].CustomInfo["profiles"] = map[string]string{"2g.4294967299gb": "0"} + fit, result, _ = dev.Fit(devices, req, &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Annotations: map[string]string{}}}, &device.NodeInfo{}, &device.PodDevices{}) + assert.Equal(t, fit, false) + assert.Equal(t, len(result[EnflameVGCUDevice]), 0) + + devices[0].CustomInfo["maxSlice"] = "1" + devices[0].CustomInfo["profiles"] = map[string]string{"2147483647g.20gb": "0"} + fit, result, _ = dev.Fit(devices, req, &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Annotations: map[string]string{}}}, &device.NodeInfo{}, &device.PodDevices{}) + assert.Equal(t, fit, false) + assert.Equal(t, len(result[EnflameVGCUDevice]), 0) +}