Commit f2f527d5 authored by Oliver Hartkopp's avatar Oliver Hartkopp Committed by Marc Kleine-Budde
Browse files

can: raw: use temp variable instead of rolling back config



Introduce a temporary variable to check for an invalid configuration
attempt from user space. Before this patch the value was copied to
the real config variable and rolled back in the case of an error.

Suggested-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: default avatarOliver Hartkopp <socketcan@hartkopp.net>
Link: https://lore.kernel.org/all/20230203090807.97100-1-socketcan@hartkopp.net


Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parent e6ebe6c1
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -523,6 +523,7 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
	struct can_filter sfilter;         /* single filter */
	struct net_device *dev = NULL;
	can_err_mask_t err_mask = 0;
	int fd_frames;
	int count = 0;
	int err = 0;

@@ -664,17 +665,17 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
		break;

	case CAN_RAW_FD_FRAMES:
		if (optlen != sizeof(ro->fd_frames))
		if (optlen != sizeof(fd_frames))
			return -EINVAL;

		if (copy_from_sockptr(&ro->fd_frames, optval, optlen))
		if (copy_from_sockptr(&fd_frames, optval, optlen))
			return -EFAULT;

		/* Enabling CAN XL includes CAN FD */
		if (ro->xl_frames && !ro->fd_frames) {
			ro->fd_frames = ro->xl_frames;
		if (ro->xl_frames && !fd_frames)
			return -EINVAL;
		}

		ro->fd_frames = fd_frames;
		break;

	case CAN_RAW_XL_FRAMES: