drivers/s390/crypto/pkey_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Number of apqn target list entries contained in 'nr_apqns' variable is
determined by userspace via an ioctl call so the result of the product in
calculation of size passed to memdup_user() may overflow.
In this case the actual size of the allocated area and the value
describing it won't be in sync leading to various types of unpredictable
behaviour later.
Use a proper memdup_array_user() helper which returns an error if an
overflow is detected. Note that it is different from when nr_apqns is
initially zero - that case is considered valid and should be handled in
subsequent pkey_handler implementations.
Found by Linux Verification Center (linuxtesting.org).
Fixes: f2bbc96e7cfa ("s390/pkey: add CCA AES cipher key support")
Cc: stable@vger.kernel.org
Signed-off-by: Fedor Pchelkin <pchelkin@ispras.ru>
---
v2: use memdup_array_user() helper (Heiko Carstens)
drivers/s390/crypto/pkey_api.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/s390/crypto/pkey_api.c b/drivers/s390/crypto/pkey_api.c
index cef60770f68b..b3fcdcae379e 100644
--- a/drivers/s390/crypto/pkey_api.c
+++ b/drivers/s390/crypto/pkey_api.c
@@ -86,7 +86,7 @@ static void *_copy_apqns_from_user(void __user *uapqns, size_t nr_apqns)
if (!uapqns || nr_apqns == 0)
return NULL;
- return memdup_user(uapqns, nr_apqns * sizeof(struct pkey_apqn));
+ return memdup_array_user(uapqns, nr_apqns, sizeof(struct pkey_apqn));
}
static int pkey_ioctl_genseck(struct pkey_genseck __user *ugs)
--
2.49.0
On Wed, Jun 11, 2025 at 10:20:10PM +0300, Fedor Pchelkin wrote: > Number of apqn target list entries contained in 'nr_apqns' variable is > determined by userspace via an ioctl call so the result of the product in > calculation of size passed to memdup_user() may overflow. > > In this case the actual size of the allocated area and the value > describing it won't be in sync leading to various types of unpredictable > behaviour later. > > Use a proper memdup_array_user() helper which returns an error if an > overflow is detected. Note that it is different from when nr_apqns is > initially zero - that case is considered valid and should be handled in > subsequent pkey_handler implementations. > > Found by Linux Verification Center (linuxtesting.org). > > Fixes: f2bbc96e7cfa ("s390/pkey: add CCA AES cipher key support") > Cc: stable@vger.kernel.org > Signed-off-by: Fedor Pchelkin <pchelkin@ispras.ru> > --- > > v2: use memdup_array_user() helper (Heiko Carstens) > > drivers/s390/crypto/pkey_api.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/s390/crypto/pkey_api.c b/drivers/s390/crypto/pkey_api.c > index cef60770f68b..b3fcdcae379e 100644 > --- a/drivers/s390/crypto/pkey_api.c > +++ b/drivers/s390/crypto/pkey_api.c > @@ -86,7 +86,7 @@ static void *_copy_apqns_from_user(void __user *uapqns, size_t nr_apqns) > if (!uapqns || nr_apqns == 0) > return NULL; > > - return memdup_user(uapqns, nr_apqns * sizeof(struct pkey_apqn)); > + return memdup_array_user(uapqns, nr_apqns, sizeof(struct pkey_apqn)); > } > > static int pkey_ioctl_genseck(struct pkey_genseck __user *ugs) Applied, thanks!
On 11/06/2025 21:20, Fedor Pchelkin wrote: > Number of apqn target list entries contained in 'nr_apqns' variable is > determined by userspace via an ioctl call so the result of the product in > calculation of size passed to memdup_user() may overflow. > > In this case the actual size of the allocated area and the value > describing it won't be in sync leading to various types of unpredictable > behaviour later. > > Use a proper memdup_array_user() helper which returns an error if an > overflow is detected. Note that it is different from when nr_apqns is > initially zero - that case is considered valid and should be handled in > subsequent pkey_handler implementations. > > Found by Linux Verification Center (linuxtesting.org). > > Fixes: f2bbc96e7cfa ("s390/pkey: add CCA AES cipher key support") > Cc: stable@vger.kernel.org > Signed-off-by: Fedor Pchelkin <pchelkin@ispras.ru> Reviewed-by: Holger Dengler <dengler@linux.ibm.com> -- Mit freundlichen Grüßen / Kind regards Holger Dengler -- IBM Systems, Linux on IBM Z Development dengler@linux.ibm.com
On Wed, Jun 11, 2025 at 10:20:10PM +0300, Fedor Pchelkin wrote: > Number of apqn target list entries contained in 'nr_apqns' variable is > determined by userspace via an ioctl call so the result of the product in > calculation of size passed to memdup_user() may overflow. > > In this case the actual size of the allocated area and the value > describing it won't be in sync leading to various types of unpredictable > behaviour later. > > Use a proper memdup_array_user() helper which returns an error if an > overflow is detected. Note that it is different from when nr_apqns is > initially zero - that case is considered valid and should be handled in > subsequent pkey_handler implementations. > > Found by Linux Verification Center (linuxtesting.org). > > Fixes: f2bbc96e7cfa ("s390/pkey: add CCA AES cipher key support") > Cc: stable@vger.kernel.org > Signed-off-by: Fedor Pchelkin <pchelkin@ispras.ru> > --- > > v2: use memdup_array_user() helper (Heiko Carstens) > > drivers/s390/crypto/pkey_api.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
© 2016 - 2025 Red Hat, Inc.