Torsten Duwe 63dafb
From 72f6e0ea2b0ecea8585f3cd4298286c85c5121e6 Mon Sep 17 00:00:00 2001
Torsten Duwe 63dafb
From: Adam Guerin <adam.guerin@intel.com>
Torsten Duwe 63dafb
Date: Wed, 21 Sep 2022 10:38:30 +0100
Torsten Duwe 63dafb
Subject: [PATCH] crypto: qat - add limit to linked list parsing
Torsten Duwe 63dafb
Git-commit: 72f6e0ea2b0ecea8585f3cd4298286c85c5121e6
Torsten Duwe 63dafb
Patch-mainline: v6.1-rc1
Torsten Duwe 63dafb
References: jsc#PED-1073
Torsten Duwe 63dafb
Torsten Duwe 63dafb
adf_copy_key_value_data() copies data from userland to kernel, based on
Torsten Duwe 63dafb
a linked link provided by userland. If userland provides a circular
Torsten Duwe 63dafb
list (or just a very long one) then it would drive a long loop where
Torsten Duwe 63dafb
allocation occurs in every loop. This could lead to low memory conditions.
Torsten Duwe 63dafb
Adding a limit to stop endless loop.
Torsten Duwe 63dafb
Torsten Duwe 63dafb
Signed-off-by: Adam Guerin <adam.guerin@intel.com>
Torsten Duwe 63dafb
Co-developed-by: Ciunas Bennett <ciunas.bennett@intel.com>
Torsten Duwe 63dafb
Signed-off-by: Ciunas Bennett <ciunas.bennett@intel.com>
Torsten Duwe 63dafb
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe 63dafb
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Torsten Duwe 63dafb
Signed-off-by: Torsten Duwe <duwe@suse.de>
Torsten Duwe 63dafb
Torsten Duwe 63dafb
---
Torsten Duwe 63dafb
 drivers/crypto/qat/qat_common/adf_ctl_drv.c | 8 ++++++--
Torsten Duwe 63dafb
 1 file changed, 6 insertions(+), 2 deletions(-)
Torsten Duwe 63dafb
Torsten Duwe 63dafb
diff --git a/drivers/crypto/qat/qat_common/adf_ctl_drv.c b/drivers/crypto/qat/qat_common/adf_ctl_drv.c
Torsten Duwe 63dafb
index 508c18edd692f..82b69e1f725ba 100644
Torsten Duwe 63dafb
--- a/drivers/crypto/qat/qat_common/adf_ctl_drv.c
Torsten Duwe 63dafb
+++ b/drivers/crypto/qat/qat_common/adf_ctl_drv.c
Torsten Duwe 63dafb
@@ -16,6 +16,9 @@
Torsten Duwe 63dafb
 #include "adf_cfg_common.h"
Torsten Duwe 63dafb
 #include "adf_cfg_user.h"
Torsten Duwe 63dafb
 
Torsten Duwe 63dafb
+#define ADF_CFG_MAX_SECTION 512
Torsten Duwe 63dafb
+#define ADF_CFG_MAX_KEY_VAL 256
Torsten Duwe 63dafb
+
Torsten Duwe 63dafb
 #define DEVICE_NAME "qat_adf_ctl"
Torsten Duwe 63dafb
 
Torsten Duwe 63dafb
 static DEFINE_MUTEX(adf_ctl_lock);
Torsten Duwe 63dafb
@@ -137,10 +140,11 @@ static int adf_copy_key_value_data(struct adf_accel_dev *accel_dev,
Torsten Duwe 63dafb
 	struct adf_user_cfg_key_val key_val;
Torsten Duwe 63dafb
 	struct adf_user_cfg_key_val *params_head;
Torsten Duwe 63dafb
 	struct adf_user_cfg_section section, *section_head;
Torsten Duwe 63dafb
+	int i, j;
Torsten Duwe 63dafb
 
Torsten Duwe 63dafb
 	section_head = ctl_data->config_section;
Torsten Duwe 63dafb
 
Torsten Duwe 63dafb
-	while (section_head) {
Torsten Duwe 63dafb
+	for (i = 0; section_head && i < ADF_CFG_MAX_SECTION; i++) {
Torsten Duwe 63dafb
 		if (copy_from_user(&section, (void __user *)section_head,
Torsten Duwe 63dafb
 				   sizeof(*section_head))) {
Torsten Duwe 63dafb
 			dev_err(&GET_DEV(accel_dev),
Torsten Duwe 63dafb
@@ -156,7 +160,7 @@ static int adf_copy_key_value_data(struct adf_accel_dev *accel_dev,
Torsten Duwe 63dafb
 
Torsten Duwe 63dafb
 		params_head = section.params;
Torsten Duwe 63dafb
 
Torsten Duwe 63dafb
-		while (params_head) {
Torsten Duwe 63dafb
+		for (j = 0; params_head && j < ADF_CFG_MAX_KEY_VAL; j++) {
Torsten Duwe 63dafb
 			if (copy_from_user(&key_val, (void __user *)params_head,
Torsten Duwe 63dafb
 					   sizeof(key_val))) {
Torsten Duwe 63dafb
 				dev_err(&GET_DEV(accel_dev),
Torsten Duwe 63dafb
-- 
Torsten Duwe 63dafb
2.35.3
Torsten Duwe 63dafb