From c8fba5d6df5e476aa791db4f1f014dad2bb5e904 Mon Sep 17 00:00:00 2001 From: Oliver Hartkopp Date: Mon, 19 Feb 2024 21:00:21 +0100 Subject: can: raw: fix getsockopt() for new CAN_RAW_XL_VCID_OPTS The code for the CAN_RAW_XL_VCID_OPTS getsockopt() was incompletely adopted from the CAN_RAW_FILTER getsockopt(). Add the missing put_user() and return statements. Flagged by Smatch. Fixes: c83c22ec1493 ("can: canxl: add virtual CAN network identifier support") Reported-by: Simon Horman Signed-off-by: Oliver Hartkopp Link: https://lore.kernel.org/all/20240219200021.12113-1-socketcan@hartkopp.net Signed-off-by: Marc Kleine-Budde --- net/can/raw.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'net/can') diff --git a/net/can/raw.c b/net/can/raw.c index cb8e6f788af8..897ffc17d850 100644 --- a/net/can/raw.c +++ b/net/can/raw.c @@ -835,7 +835,9 @@ static int raw_getsockopt(struct socket *sock, int level, int optname, if (copy_to_user(optval, &ro->raw_vcid_opts, len)) err = -EFAULT; } - break; + if (!err) + err = put_user(len, optlen); + return err; case CAN_RAW_JOIN_FILTERS: if (len > sizeof(int)) -- cgit v1.2.3 From 00bf80c437dcbbd808d61cc2866c8f065ff436bd Mon Sep 17 00:00:00 2001 From: Marc Kleine-Budde Date: Tue, 20 Feb 2024 09:16:16 +0100 Subject: can: raw: raw_getsockopt(): reduce scope of err Reduce the scope of the variable "err" to the individual cases. This is to avoid the mistake of setting "err" in the mistaken belief that it will be evaluated later. Reviewed-by: Vincent Mailhol Link: https://lore.kernel.org/all/20240220-raw-setsockopt-v1-1-7d34cb1377fc@pengutronix.de Signed-off-by: Marc Kleine-Budde --- net/can/raw.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'net/can') diff --git a/net/can/raw.c b/net/can/raw.c index 897ffc17d850..00533f64d69d 100644 --- a/net/can/raw.c +++ b/net/can/raw.c @@ -756,7 +756,6 @@ static int raw_getsockopt(struct socket *sock, int level, int optname, struct raw_sock *ro = raw_sk(sk); int len; void *val; - int err = 0; if (level != SOL_CAN_RAW) return -EINVAL; @@ -766,7 +765,9 @@ static int raw_getsockopt(struct socket *sock, int level, int optname, return -EINVAL; switch (optname) { - case CAN_RAW_FILTER: + case CAN_RAW_FILTER: { + int err = 0; + lock_sock(sk); if (ro->count > 0) { int fsize = ro->count * sizeof(struct can_filter); @@ -791,7 +792,7 @@ static int raw_getsockopt(struct socket *sock, int level, int optname, if (!err) err = put_user(len, optlen); return err; - + } case CAN_RAW_ERR_FILTER: if (len > sizeof(can_err_mask_t)) len = sizeof(can_err_mask_t); @@ -822,7 +823,9 @@ static int raw_getsockopt(struct socket *sock, int level, int optname, val = &ro->xl_frames; break; - case CAN_RAW_XL_VCID_OPTS: + case CAN_RAW_XL_VCID_OPTS: { + int err = 0; + /* user space buffer to small for VCID opts? */ if (len < sizeof(ro->raw_vcid_opts)) { /* return -ERANGE and needed space in optlen */ @@ -838,7 +841,7 @@ static int raw_getsockopt(struct socket *sock, int level, int optname, if (!err) err = put_user(len, optlen); return err; - + } case CAN_RAW_JOIN_FILTERS: if (len > sizeof(int)) len = sizeof(int); -- cgit v1.2.3