Add NULL check to ddev argument and guard pdev_num against underflow.
Signed-off-by: Lijo Lazar <[email protected]>
---
drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.c | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.c
b/drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.c
index ae40f64369ab..a569163de047 100644
--- a/drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.c
+++ b/drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.c
@@ -44,7 +44,7 @@ static const struct drm_driver amdgpu_xcp_driver = {
.minor = 0,
};
-static int8_t pdev_num;
+static u8 pdev_num;
static struct xcp_device *xcp_dev[MAX_XCP_PLATFORM_DEVICE];
static DEFINE_MUTEX(xcp_mutex);
@@ -56,6 +56,10 @@ int amdgpu_xcp_drm_dev_alloc(struct drm_device **ddev)
int ret, i;
static_assert(sizeof(dev_name) >= sizeof("amdgpu_xcp_") + 10);
+ if (!ddev)
+ return -EINVAL;
+
+ BUILD_BUG_ON(MAX_XCP_PLATFORM_DEVICE >= U8_MAX);
guard(mutex)(&xcp_mutex);
@@ -102,7 +106,7 @@ int amdgpu_xcp_drm_dev_alloc(struct drm_device **ddev)
}
EXPORT_SYMBOL(amdgpu_xcp_drm_dev_alloc);
-static void free_xcp_dev(int8_t index)
+static void free_xcp_dev(uint8_t index)
{
if ((index < MAX_XCP_PLATFORM_DEVICE) && (xcp_dev[index])) {
struct platform_device *pdev = xcp_dev[index]->pdev;
@@ -111,17 +115,18 @@ static void free_xcp_dev(int8_t index)
platform_device_unregister(pdev);
xcp_dev[index] = NULL;
- pdev_num--;
+ if (pdev_num > 0)
+ pdev_num--;
}
}
void amdgpu_xcp_drm_dev_free(struct drm_device *ddev)
{
- int8_t i;
+ uint8_t i;
guard(mutex)(&xcp_mutex);
- for (i = 0; i < MAX_XCP_PLATFORM_DEVICE; i++) {
+ for (i = 0; pdev_num && i < MAX_XCP_PLATFORM_DEVICE; i++) {
if ((xcp_dev[i]) && (&xcp_dev[i]->drm == ddev)) {
free_xcp_dev(i);
break;
@@ -132,7 +137,7 @@ EXPORT_SYMBOL(amdgpu_xcp_drm_dev_free);
void amdgpu_xcp_drv_release(void)
{
- int8_t i;
+ uint8_t i;
guard(mutex)(&xcp_mutex);
--
2.49.0