aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEd Maste <emaste@FreeBSD.org>2022-03-28 13:33:54 +0000
committerEd Maste <emaste@FreeBSD.org>2022-03-29 00:35:47 +0000
commit8276c4149b5fc7c755d6b244fbbf6dae1939f087 (patch)
tree3611c95688bd695db5eaa7d04b85ecca24dd2459
parent5ac91821f5d7dd701752ba76041720d240a507c5 (diff)
-rw-r--r--sys/dev/mpr/mpr_user.c13
-rw-r--r--sys/dev/mps/mps_user.c13
-rw-r--r--sys/dev/mpt/mpt_user.c13
3 files changed, 39 insertions, 0 deletions
diff --git a/sys/dev/mpr/mpr_user.c b/sys/dev/mpr/mpr_user.c
index cab865e2e535..08c2b8b39244 100644
--- a/sys/dev/mpr/mpr_user.c
+++ b/sys/dev/mpr/mpr_user.c
@@ -2266,6 +2266,10 @@ mpr_ioctl(struct cdev *dev, u_long cmd, void *arg, int flag,
mpr_unlock(sc);
break;
case MPRIO_READ_CFG_PAGE:
+ if (page_req->len < (int)sizeof(MPI2_CONFIG_PAGE_HEADER)) {
+ error = EINVAL;
+ break;
+ }
mpr_page = malloc(page_req->len, M_MPRUSER, M_WAITOK | M_ZERO);
error = copyin(page_req->buf, mpr_page,
sizeof(MPI2_CONFIG_PAGE_HEADER));
@@ -2284,6 +2288,11 @@ mpr_ioctl(struct cdev *dev, u_long cmd, void *arg, int flag,
mpr_unlock(sc);
break;
case MPRIO_READ_EXT_CFG_PAGE:
+ if (ext_page_req->len <
+ (int)sizeof(MPI2_CONFIG_EXTENDED_PAGE_HEADER)) {
+ error = EINVAL;
+ break;
+ }
mpr_page = malloc(ext_page_req->len, M_MPRUSER,
M_WAITOK | M_ZERO);
error = copyin(ext_page_req->buf, mpr_page,
@@ -2298,6 +2307,10 @@ mpr_ioctl(struct cdev *dev, u_long cmd, void *arg, int flag,
error = copyout(mpr_page, ext_page_req->buf, ext_page_req->len);
break;
case MPRIO_WRITE_CFG_PAGE:
+ if (page_req->len < (int)sizeof(MPI2_CONFIG_PAGE_HEADER)) {
+ error = EINVAL;
+ break;
+ }
mpr_page = malloc(page_req->len, M_MPRUSER, M_WAITOK|M_ZERO);
error = copyin(page_req->buf, mpr_page, page_req->len);
if (error)
diff --git a/sys/dev/mps/mps_user.c b/sys/dev/mps/mps_user.c
index 4b09b486b0dd..cdab4d4cd841 100644
--- a/sys/dev/mps/mps_user.c
+++ b/sys/dev/mps/mps_user.c
@@ -2156,6 +2156,10 @@ mps_ioctl(struct cdev *dev, u_long cmd, void *arg, int flag,
mps_unlock(sc);
break;
case MPSIO_READ_CFG_PAGE:
+ if (page_req->len < (int)sizeof(MPI2_CONFIG_PAGE_HEADER)) {
+ error = EINVAL;
+ break;
+ }
mps_page = malloc(page_req->len, M_MPSUSER, M_WAITOK | M_ZERO);
error = copyin(page_req->buf, mps_page,
sizeof(MPI2_CONFIG_PAGE_HEADER));
@@ -2174,6 +2178,11 @@ mps_ioctl(struct cdev *dev, u_long cmd, void *arg, int flag,
mps_unlock(sc);
break;
case MPSIO_READ_EXT_CFG_PAGE:
+ if (ext_page_req->len <
+ (int)sizeof(MPI2_CONFIG_EXTENDED_PAGE_HEADER)) {
+ error = EINVAL;
+ break;
+ }
mps_page = malloc(ext_page_req->len, M_MPSUSER, M_WAITOK|M_ZERO);
error = copyin(ext_page_req->buf, mps_page,
sizeof(MPI2_CONFIG_EXTENDED_PAGE_HEADER));
@@ -2187,6 +2196,10 @@ mps_ioctl(struct cdev *dev, u_long cmd, void *arg, int flag,
error = copyout(mps_page, ext_page_req->buf, ext_page_req->len);
break;
case MPSIO_WRITE_CFG_PAGE:
+ if (page_req->len < (int)sizeof(MPI2_CONFIG_PAGE_HEADER)) {
+ error = EINVAL;
+ break;
+ }
mps_page = malloc(page_req->len, M_MPSUSER, M_WAITOK|M_ZERO);
error = copyin(page_req->buf, mps_page, page_req->len);
if (error)
diff --git a/sys/dev/mpt/mpt_user.c b/sys/dev/mpt/mpt_user.c
index cf339387c10e..10d5bac15d49 100644
--- a/sys/dev/mpt/mpt_user.c
+++ b/sys/dev/mpt/mpt_user.c
@@ -672,6 +672,10 @@ mpt_ioctl(struct cdev *dev, u_long cmd, caddr_t arg, int flag, struct thread *td
case MPTIO_READ_CFG_PAGE32:
#endif
case MPTIO_READ_CFG_PAGE:
+ if (page_req->len < (int)sizeof(CONFIG_PAGE_HEADER)) {
+ error = EINVAL;
+ break;
+ }
error = mpt_alloc_buffer(mpt, &mpt_page, page_req->len);
if (error)
break;
@@ -698,6 +702,11 @@ mpt_ioctl(struct cdev *dev, u_long cmd, caddr_t arg, int flag, struct thread *td
case MPTIO_READ_EXT_CFG_PAGE32:
#endif
case MPTIO_READ_EXT_CFG_PAGE:
+ if (ext_page_req->len <
+ (int)sizeof(CONFIG_EXTENDED_PAGE_HEADER)) {
+ error = EINVAL;
+ break;
+ }
error = mpt_alloc_buffer(mpt, &mpt_page, ext_page_req->len);
if (error)
break;
@@ -717,6 +726,10 @@ mpt_ioctl(struct cdev *dev, u_long cmd, caddr_t arg, int flag, struct thread *td
case MPTIO_WRITE_CFG_PAGE32:
#endif
case MPTIO_WRITE_CFG_PAGE:
+ if (page_req->len < (int)sizeof(CONFIG_PAGE_HEADER)) {
+ error = EINVAL;
+ break;
+ }
error = mpt_alloc_buffer(mpt, &mpt_page, page_req->len);
if (error)
break;