Re: [RFC PATCH 1/4] net: introduce get_optlen() and put_optlen() helpers
Breno Leitao <[email protected]> Tue, 1 Apr 2025 05:17:09 -0700
| Newsgroups | org.kernel.vger.dccp,dev.linux.lists.mptcp,dev.linux.lists.virtualization,org.kernel.vger.bpf,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.linux-x25,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).