Re: [RFC PATCH 1/4] net: introduce get_optlen() and put_optlen() helpers

Breno Leitao <[email protected]>
Newsgroups org.kernel.vger.linux-x25,dev.linux.lists.mptcp,dev.linux.lists.virtualization,org.kernel.vger.bpf,org.kernel.vger.dccp,org.kernel.vger.io-uring,org.kernel.vger.linux-bluetooth,org.kernel.vger.linux-can,org.kernel.vger.linux-hams,org.kernel.vger.linux-kernel,org.kernel.vger.linux-rdma,org.kernel.vger.linux-s390,org.kernel.vger.linux-sctp,org.kernel.vger.linux-wpan,org.kernel.vger.netdev
Message-ID <[email protected]>
Hello Stefan,

On Mon, Mar 31, 2025 at 10:10:53PM +0200, Stefan Metzmacher wrote:
> --- a/include/linux/sockptr.h
> +++ b/include/linux/sockptr.h
> @@ -169,4 +169,26 @@ static inline int check_zeroed_sockptr(sockptr_t src, size_t offset,
>  	return memchr_inv(src.kernel + offset, 0, size) == NULL;
>  }
>  
> +#define __check_optlen_t(__optlen)				\
> +({								\
> +	int __user *__ptr __maybe_unused = __optlen; 		\
> +	BUILD_BUG_ON(sizeof(*(__ptr)) != sizeof(int));		\
> +})

I am a bit confused about this macro. I understand that this macro's
goal is to check that __optlen is a pointer to an integer, otherwise
failed to build.

It is unclear to me if that is what it does. Let's suppose that __optlen
is not an integer pointer. Then:

> int __user *__ptr __maybe_unused = __optlen;

This will generate a compile failure/warning due invalid casting,
depending on -Wincompatible-pointer-types.

> BUILD_BUG_ON(sizeof(*(__ptr)) != sizeof(int));

Then this comparison will always false, since __ptr is a pointer to int,
and you are comparing the size of its content with the sizeof(int).
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.