libwd/0014-uadk-modify-address-check.patch
2024-09-04 13:56:05 +08:00

175 lines
5.1 KiB
Diff

From a98d790c195cd41b839c5058c96eb8e10733783a Mon Sep 17 00:00:00 2001
From: Weili Qian <qianweili@huawei.com>
Date: Tue, 20 Aug 2024 11:37:47 +0800
Subject: [PATCH 14/16] uadk: modify address check
When the memory is in SGL format, both wd_check_src_dst and
wd_check_datalist are called for address check. Actually,
only wd_check_datalist needs to be called.
Signed-off-by: Weili Qian <qianweili@huawei.com>
Signed-off-by: Qi Tao <taoqi10@huawei.com>
---
include/wd_util.h | 2 +-
wd_aead.c | 19 +++++++++----------
wd_cipher.c | 14 +++++++-------
wd_digest.c | 18 ++++++++++++------
wd_util.c | 4 ++--
5 files changed, 31 insertions(+), 26 deletions(-)
diff --git a/include/wd_util.h b/include/wd_util.h
index f217f0f..1c4af0b 100644
--- a/include/wd_util.h
+++ b/include/wd_util.h
@@ -254,7 +254,7 @@ int wd_check_src_dst(void *src, __u32 in_bytes, void *dst, __u32 out_bytes);
*
* Return 0 if the datalist is not less than expected size.
*/
-int wd_check_datalist(struct wd_datalist *head, __u32 size);
+int wd_check_datalist(struct wd_datalist *head, __u64 size);
/*
diff --git a/wd_aead.c b/wd_aead.c
index 9c3f1ab..65949f7 100644
--- a/wd_aead.c
+++ b/wd_aead.c
@@ -374,7 +374,7 @@ void wd_aead_free_sess(handle_t h_sess)
static int wd_aead_param_check(struct wd_aead_sess *sess,
struct wd_aead_req *req)
{
- __u32 len;
+ __u64 len;
int ret;
if (unlikely(!sess || !req)) {
@@ -410,18 +410,11 @@ static int wd_aead_param_check(struct wd_aead_sess *sess,
return -WD_EINVAL;
}
- ret = wd_check_src_dst(req->src, req->in_bytes, req->dst, req->out_bytes);
- if (unlikely(ret)) {
- WD_ERR("invalid: src/dst addr is NULL when src/dst size is non-zero!\n");
- return -WD_EINVAL;
- }
-
if (req->data_fmt == WD_SGL_BUF) {
- len = req->in_bytes + req->assoc_bytes;
+ len = (__u64)req->in_bytes + req->assoc_bytes;
ret = wd_check_datalist(req->list_src, len);
if (unlikely(ret)) {
- WD_ERR("failed to check the src datalist, size = %u\n",
- len);
+ WD_ERR("failed to check the src datalist, size = %llu\n", len);
return -WD_EINVAL;
}
@@ -431,6 +424,12 @@ static int wd_aead_param_check(struct wd_aead_sess *sess,
req->out_bytes);
return -WD_EINVAL;
}
+ } else {
+ ret = wd_check_src_dst(req->src, req->in_bytes, req->dst, req->out_bytes);
+ if (unlikely(ret)) {
+ WD_ERR("invalid: src/dst addr is NULL when src/dst size is non-zero!\n");
+ return -WD_EINVAL;
+ }
}
return 0;
diff --git a/wd_cipher.c b/wd_cipher.c
index 4799213..646aa89 100644
--- a/wd_cipher.c
+++ b/wd_cipher.c
@@ -560,7 +560,7 @@ static int cipher_iv_len_check(struct wd_cipher_req *req,
if (!req->iv) {
WD_ERR("invalid: cipher input iv is NULL!\n");
- ret = -WD_EINVAL;
+ return -WD_EINVAL;
}
switch (sess->alg) {
@@ -636,12 +636,6 @@ static int wd_cipher_check_params(handle_t h_sess,
if (unlikely(ret))
return ret;
- ret = wd_check_src_dst(req->src, req->in_bytes, req->dst, req->out_bytes);
- if (unlikely(ret)) {
- WD_ERR("invalid: src/dst addr is NULL when src/dst size is non-zero!\n");
- return -WD_EINVAL;
- }
-
if (req->data_fmt == WD_SGL_BUF) {
ret = wd_check_datalist(req->list_src, req->in_bytes);
if (unlikely(ret)) {
@@ -657,6 +651,12 @@ static int wd_cipher_check_params(handle_t h_sess,
req->in_bytes);
return -WD_EINVAL;
}
+ } else {
+ ret = wd_check_src_dst(req->src, req->in_bytes, req->dst, req->out_bytes);
+ if (unlikely(ret)) {
+ WD_ERR("invalid: src/dst addr is NULL when src/dst size is non-zero!\n");
+ return -WD_EINVAL;
+ }
}
return cipher_iv_len_check(req, sess);
diff --git a/wd_digest.c b/wd_digest.c
index f116aec..943fd8c 100644
--- a/wd_digest.c
+++ b/wd_digest.c
@@ -548,12 +548,6 @@ static int wd_digest_param_check(struct wd_digest_sess *sess,
return -WD_EINVAL;
}
- ret = wd_check_src_dst(req->in, req->in_bytes, req->out, req->out_bytes);
- if (unlikely(ret)) {
- WD_ERR("invalid: in/out addr is NULL when in/out size is non-zero!\n");
- return -WD_EINVAL;
- }
-
if (req->data_fmt == WD_SGL_BUF) {
ret = wd_check_datalist(req->list_in, req->in_bytes);
if (unlikely(ret)) {
@@ -561,6 +555,18 @@ static int wd_digest_param_check(struct wd_digest_sess *sess,
req->in_bytes);
return -WD_EINVAL;
}
+
+ ret = wd_check_src_dst(NULL, 0, req->out, req->out_bytes);
+ if (unlikely(ret)) {
+ WD_ERR("invalid: out addr is NULL when out size is non-zero!\n");
+ return -WD_EINVAL;
+ }
+ } else {
+ ret = wd_check_src_dst(req->in, req->in_bytes, req->out, req->out_bytes);
+ if (unlikely(ret)) {
+ WD_ERR("invalid: in/out addr is NULL when in/out size is non-zero!\n");
+ return -WD_EINVAL;
+ }
}
return wd_aes_hmac_length_check(sess, req);
diff --git a/wd_util.c b/wd_util.c
index 76548c9..5350f84 100644
--- a/wd_util.c
+++ b/wd_util.c
@@ -475,10 +475,10 @@ int wd_check_src_dst(void *src, __u32 in_bytes, void *dst, __u32 out_bytes)
return 0;
}
-int wd_check_datalist(struct wd_datalist *head, __u32 size)
+int wd_check_datalist(struct wd_datalist *head, __u64 size)
{
struct wd_datalist *tmp = head;
- __u32 list_size = 0;
+ __u64 list_size = 0;
while (tmp) {
if (tmp->data)
--
2.25.1