* [PATCH net v3 0/4] net: Fix some callers of copy_from_sockptr() @ 2024-11-19 13:31 Michal Luczaj 2024-11-19 13:31 ` [PATCH net v3 1/4] Bluetooth: Improve setsockopt() handling of malformed user input Michal Luczaj ` (7 more replies) 0 siblings, 8 replies; 10+ messages in thread From: Michal Luczaj @ 2024-11-19 13:31 UTC (permalink / raw) To: Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz, David S. Miller, Eric Dumazet, Paolo Abeni, Simon Horman, David Howells, Marc Dionne Cc: Luiz Augusto von Dentz, linux-bluetooth, netdev, linux-afs, Jakub Kicinski, Michal Luczaj, David Wei Some callers misinterpret copy_from_sockptr()'s return value. The function follows copy_from_user(), i.e. returns 0 for success, or the number of bytes not copied on error. Simply returning the result in a non-zero case isn't usually what was intended. Compile tested with CONFIG_LLC, CONFIG_AF_RXRPC, CONFIG_BT enabled. Last patch probably belongs more to net-next, if any. Here as an RFC. Suggested-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Michal Luczaj <mhal@rbox.co> --- Changes in v3: - rxrpc/llc: Drop the non-essential changes - rxrpc/llc: Replace the deprecated copy_from_sockptr() with copy_safe_from_sockptr() [David Wei] - Collect Reviewed-by [David Wei] - Link to v2: https://lore.kernel.org/r/20241115-sockptr-copy-fixes-v2-0-9b1254c18b7a@rbox.co Changes in v2: - Fix the fix of llc_ui_setsockopt() - Switch "bluetooth:" to "Bluetooth:" [bluez.test.bot] - Collect Reviewed-by [Luiz Augusto von Dentz] - Link to v1: https://lore.kernel.org/r/20241115-sockptr-copy-fixes-v1-0-d183c87fcbd5@rbox.co --- Michal Luczaj (4): Bluetooth: Improve setsockopt() handling of malformed user input llc: Improve setsockopt() handling of malformed user input rxrpc: Improve setsockopt() handling of malformed user input net: Comment copy_from_sockptr() explaining its behaviour include/linux/sockptr.h | 2 ++ include/net/bluetooth/bluetooth.h | 9 --------- net/bluetooth/hci_sock.c | 14 +++++++------- net/bluetooth/iso.c | 10 +++++----- net/bluetooth/l2cap_sock.c | 20 +++++++++++--------- net/bluetooth/rfcomm/sock.c | 9 ++++----- net/bluetooth/sco.c | 11 ++++++----- net/llc/af_llc.c | 2 +- net/rxrpc/af_rxrpc.c | 7 ++++--- 9 files changed, 40 insertions(+), 44 deletions(-) --- base-commit: 66418447d27b7f4c027587582a133dd0bc0a663b change-id: 20241114-sockptr-copy-fixes-3999eaa81aa1 Best regards, -- Michal Luczaj <mhal@rbox.co> ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH net v3 1/4] Bluetooth: Improve setsockopt() handling of malformed user input 2024-11-19 13:31 [PATCH net v3 0/4] net: Fix some callers of copy_from_sockptr() Michal Luczaj @ 2024-11-19 13:31 ` Michal Luczaj 2024-11-19 13:31 ` [PATCH net v3 2/4] llc: " Michal Luczaj ` (6 subsequent siblings) 7 siblings, 0 replies; 10+ messages in thread From: Michal Luczaj @ 2024-11-19 13:31 UTC (permalink / raw) To: Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz, David S. Miller, Eric Dumazet, Paolo Abeni, Simon Horman, David Howells, Marc Dionne Cc: Luiz Augusto von Dentz, linux-bluetooth, netdev, linux-afs, Jakub Kicinski, Michal Luczaj, David Wei The bt_copy_from_sockptr() return value is being misinterpreted by most users: a non-zero result is mistakenly assumed to represent an error code, but actually indicates the number of bytes that could not be copied. Remove bt_copy_from_sockptr() and adapt callers to use copy_safe_from_sockptr(). For sco_sock_setsockopt() (case BT_CODEC) use copy_struct_from_sockptr() to scrub parts of uninitialized buffer. Opportunistically, rename `len` to `optlen` in hci_sock_setsockopt_old() and hci_sock_setsockopt(). Fixes: 51eda36d33e4 ("Bluetooth: SCO: Fix not validating setsockopt user input") Fixes: a97de7bff13b ("Bluetooth: RFCOMM: Fix not validating setsockopt user input") Fixes: 4f3951242ace ("Bluetooth: L2CAP: Fix not validating setsockopt user input") Fixes: 9e8742cdfc4b ("Bluetooth: ISO: Fix not validating setsockopt user input") Fixes: b2186061d604 ("Bluetooth: hci_sock: Fix not validating setsockopt user input") Reviewed-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> Reviewed-by: David Wei <dw@davidwei.uk> Signed-off-by: Michal Luczaj <mhal@rbox.co> --- include/net/bluetooth/bluetooth.h | 9 --------- net/bluetooth/hci_sock.c | 14 +++++++------- net/bluetooth/iso.c | 10 +++++----- net/bluetooth/l2cap_sock.c | 20 +++++++++++--------- net/bluetooth/rfcomm/sock.c | 9 ++++----- net/bluetooth/sco.c | 11 ++++++----- 6 files changed, 33 insertions(+), 40 deletions(-) diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index f66bc85c6411dd5d49eca7756577fea05feaf144..e6760c11f007752ff05792f1de09b70bfb57213c 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h @@ -590,15 +590,6 @@ static inline struct sk_buff *bt_skb_sendmmsg(struct sock *sk, return skb; } -static inline int bt_copy_from_sockptr(void *dst, size_t dst_size, - sockptr_t src, size_t src_size) -{ - if (dst_size > src_size) - return -EINVAL; - - return copy_from_sockptr(dst, src, dst_size); -} - int bt_to_errno(u16 code); __u8 bt_status(int err); diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index 2272e1849ebd894a6b83f665d8fa45610778463c..022b86797acdc56a6e9b85f24f4c98a0247831c9 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c @@ -1926,7 +1926,7 @@ static int hci_sock_sendmsg(struct socket *sock, struct msghdr *msg, } static int hci_sock_setsockopt_old(struct socket *sock, int level, int optname, - sockptr_t optval, unsigned int len) + sockptr_t optval, unsigned int optlen) { struct hci_ufilter uf = { .opcode = 0 }; struct sock *sk = sock->sk; @@ -1943,7 +1943,7 @@ static int hci_sock_setsockopt_old(struct socket *sock, int level, int optname, switch (optname) { case HCI_DATA_DIR: - err = bt_copy_from_sockptr(&opt, sizeof(opt), optval, len); + err = copy_safe_from_sockptr(&opt, sizeof(opt), optval, optlen); if (err) break; @@ -1954,7 +1954,7 @@ static int hci_sock_setsockopt_old(struct socket *sock, int level, int optname, break; case HCI_TIME_STAMP: - err = bt_copy_from_sockptr(&opt, sizeof(opt), optval, len); + err = copy_safe_from_sockptr(&opt, sizeof(opt), optval, optlen); if (err) break; @@ -1974,7 +1974,7 @@ static int hci_sock_setsockopt_old(struct socket *sock, int level, int optname, uf.event_mask[1] = *((u32 *) f->event_mask + 1); } - err = bt_copy_from_sockptr(&uf, sizeof(uf), optval, len); + err = copy_safe_from_sockptr(&uf, sizeof(uf), optval, optlen); if (err) break; @@ -2005,7 +2005,7 @@ static int hci_sock_setsockopt_old(struct socket *sock, int level, int optname, } static int hci_sock_setsockopt(struct socket *sock, int level, int optname, - sockptr_t optval, unsigned int len) + sockptr_t optval, unsigned int optlen) { struct sock *sk = sock->sk; int err = 0; @@ -2015,7 +2015,7 @@ static int hci_sock_setsockopt(struct socket *sock, int level, int optname, if (level == SOL_HCI) return hci_sock_setsockopt_old(sock, level, optname, optval, - len); + optlen); if (level != SOL_BLUETOOTH) return -ENOPROTOOPT; @@ -2035,7 +2035,7 @@ static int hci_sock_setsockopt(struct socket *sock, int level, int optname, goto done; } - err = bt_copy_from_sockptr(&opt, sizeof(opt), optval, len); + err = copy_safe_from_sockptr(&opt, sizeof(opt), optval, optlen); if (err) break; diff --git a/net/bluetooth/iso.c b/net/bluetooth/iso.c index 7a83e400ac77a0a0df41b206643bae6fc031631b..5f278971d7fa25b32b6f70a5fc5a7500db0fdc99 100644 --- a/net/bluetooth/iso.c +++ b/net/bluetooth/iso.c @@ -1503,7 +1503,7 @@ static int iso_sock_setsockopt(struct socket *sock, int level, int optname, break; } - err = bt_copy_from_sockptr(&opt, sizeof(opt), optval, optlen); + err = copy_safe_from_sockptr(&opt, sizeof(opt), optval, optlen); if (err) break; @@ -1514,7 +1514,7 @@ static int iso_sock_setsockopt(struct socket *sock, int level, int optname, break; case BT_PKT_STATUS: - err = bt_copy_from_sockptr(&opt, sizeof(opt), optval, optlen); + err = copy_safe_from_sockptr(&opt, sizeof(opt), optval, optlen); if (err) break; @@ -1533,7 +1533,7 @@ static int iso_sock_setsockopt(struct socket *sock, int level, int optname, break; } - err = bt_copy_from_sockptr(&qos, sizeof(qos), optval, optlen); + err = copy_safe_from_sockptr(&qos, sizeof(qos), optval, optlen); if (err) break; @@ -1554,8 +1554,8 @@ static int iso_sock_setsockopt(struct socket *sock, int level, int optname, break; } - err = bt_copy_from_sockptr(iso_pi(sk)->base, optlen, optval, - optlen); + err = copy_safe_from_sockptr(iso_pi(sk)->base, optlen, optval, + optlen); if (err) break; diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index ba437c6f6ee591a5624f5fbfbf28f2a80d399372..5ab203b55ab7e2c0682349a6eab9620e3e8a024c 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c @@ -755,7 +755,8 @@ static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, opts.max_tx = chan->max_tx; opts.txwin_size = chan->tx_win; - err = bt_copy_from_sockptr(&opts, sizeof(opts), optval, optlen); + err = copy_safe_from_sockptr(&opts, sizeof(opts), optval, + optlen); if (err) break; @@ -800,7 +801,7 @@ static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, break; case L2CAP_LM: - err = bt_copy_from_sockptr(&opt, sizeof(opt), optval, optlen); + err = copy_safe_from_sockptr(&opt, sizeof(opt), optval, optlen); if (err) break; @@ -909,7 +910,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, sec.level = BT_SECURITY_LOW; - err = bt_copy_from_sockptr(&sec, sizeof(sec), optval, optlen); + err = copy_safe_from_sockptr(&sec, sizeof(sec), optval, optlen); if (err) break; @@ -956,7 +957,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, break; } - err = bt_copy_from_sockptr(&opt, sizeof(opt), optval, optlen); + err = copy_safe_from_sockptr(&opt, sizeof(opt), optval, optlen); if (err) break; @@ -970,7 +971,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, break; case BT_FLUSHABLE: - err = bt_copy_from_sockptr(&opt, sizeof(opt), optval, optlen); + err = copy_safe_from_sockptr(&opt, sizeof(opt), optval, optlen); if (err) break; @@ -1004,7 +1005,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, pwr.force_active = BT_POWER_FORCE_ACTIVE_ON; - err = bt_copy_from_sockptr(&pwr, sizeof(pwr), optval, optlen); + err = copy_safe_from_sockptr(&pwr, sizeof(pwr), optval, optlen); if (err) break; @@ -1015,7 +1016,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, break; case BT_CHANNEL_POLICY: - err = bt_copy_from_sockptr(&opt, sizeof(opt), optval, optlen); + err = copy_safe_from_sockptr(&opt, sizeof(opt), optval, optlen); if (err) break; @@ -1046,7 +1047,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, break; } - err = bt_copy_from_sockptr(&mtu, sizeof(mtu), optval, optlen); + err = copy_safe_from_sockptr(&mtu, sizeof(mtu), optval, optlen); if (err) break; @@ -1076,7 +1077,8 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, break; } - err = bt_copy_from_sockptr(&mode, sizeof(mode), optval, optlen); + err = copy_safe_from_sockptr(&mode, sizeof(mode), optval, + optlen); if (err) break; diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index f48250e3f2e103c75d5937e1608e43c123aa3297..1001fb4cc21c0ecc7bcdd3ea9041770ede4f27b8 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c @@ -629,10 +629,9 @@ static int rfcomm_sock_setsockopt_old(struct socket *sock, int optname, switch (optname) { case RFCOMM_LM: - if (bt_copy_from_sockptr(&opt, sizeof(opt), optval, optlen)) { - err = -EFAULT; + err = copy_safe_from_sockptr(&opt, sizeof(opt), optval, optlen); + if (err) break; - } if (opt & RFCOMM_LM_FIPS) { err = -EINVAL; @@ -685,7 +684,7 @@ static int rfcomm_sock_setsockopt(struct socket *sock, int level, int optname, sec.level = BT_SECURITY_LOW; - err = bt_copy_from_sockptr(&sec, sizeof(sec), optval, optlen); + err = copy_safe_from_sockptr(&sec, sizeof(sec), optval, optlen); if (err) break; @@ -703,7 +702,7 @@ static int rfcomm_sock_setsockopt(struct socket *sock, int level, int optname, break; } - err = bt_copy_from_sockptr(&opt, sizeof(opt), optval, optlen); + err = copy_safe_from_sockptr(&opt, sizeof(opt), optval, optlen); if (err) break; diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index 1c7252a3686694284b0b1e1101e3d16b90d906c4..700abb639a554521b9b5d46298d5ed926d228470 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c @@ -853,7 +853,7 @@ static int sco_sock_setsockopt(struct socket *sock, int level, int optname, break; } - err = bt_copy_from_sockptr(&opt, sizeof(opt), optval, optlen); + err = copy_safe_from_sockptr(&opt, sizeof(opt), optval, optlen); if (err) break; @@ -872,8 +872,8 @@ static int sco_sock_setsockopt(struct socket *sock, int level, int optname, voice.setting = sco_pi(sk)->setting; - err = bt_copy_from_sockptr(&voice, sizeof(voice), optval, - optlen); + err = copy_safe_from_sockptr(&voice, sizeof(voice), optval, + optlen); if (err) break; @@ -898,7 +898,7 @@ static int sco_sock_setsockopt(struct socket *sock, int level, int optname, break; case BT_PKT_STATUS: - err = bt_copy_from_sockptr(&opt, sizeof(opt), optval, optlen); + err = copy_safe_from_sockptr(&opt, sizeof(opt), optval, optlen); if (err) break; @@ -941,7 +941,8 @@ static int sco_sock_setsockopt(struct socket *sock, int level, int optname, break; } - err = bt_copy_from_sockptr(buffer, optlen, optval, optlen); + err = copy_struct_from_sockptr(buffer, sizeof(buffer), optval, + optlen); if (err) { hci_dev_put(hdev); break; -- 2.46.2 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH net v3 2/4] llc: Improve setsockopt() handling of malformed user input 2024-11-19 13:31 [PATCH net v3 0/4] net: Fix some callers of copy_from_sockptr() Michal Luczaj 2024-11-19 13:31 ` [PATCH net v3 1/4] Bluetooth: Improve setsockopt() handling of malformed user input Michal Luczaj @ 2024-11-19 13:31 ` Michal Luczaj 2024-11-19 13:31 ` [PATCH net v3 3/4] rxrpc: " Michal Luczaj ` (5 subsequent siblings) 7 siblings, 0 replies; 10+ messages in thread From: Michal Luczaj @ 2024-11-19 13:31 UTC (permalink / raw) To: Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz, David S. Miller, Eric Dumazet, Paolo Abeni, Simon Horman, David Howells, Marc Dionne Cc: Luiz Augusto von Dentz, linux-bluetooth, netdev, linux-afs, Jakub Kicinski, Michal Luczaj, David Wei copy_from_sockptr() is used incorrectly: return value is the number of bytes that could not be copied. Since it's deprecated, switch to copy_safe_from_sockptr(). Note: Keeping the `optlen != sizeof(int)` check as copy_safe_from_sockptr() by itself would also accept optlen > sizeof(int). Which would allow a more lenient handling of inputs. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Suggested-by: David Wei <dw@davidwei.uk> Signed-off-by: Michal Luczaj <mhal@rbox.co> --- net/llc/af_llc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c index 4eb52add7103b0f83d6fe7318abf1d1af533d254..0259cde394ba09795a6bf0d44c4ea6767e200aea 100644 --- a/net/llc/af_llc.c +++ b/net/llc/af_llc.c @@ -1098,7 +1098,7 @@ static int llc_ui_setsockopt(struct socket *sock, int level, int optname, lock_sock(sk); if (unlikely(level != SOL_LLC || optlen != sizeof(int))) goto out; - rc = copy_from_sockptr(&opt, optval, sizeof(opt)); + rc = copy_safe_from_sockptr(&opt, sizeof(opt), optval, optlen); if (rc) goto out; rc = -EINVAL; -- 2.46.2 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH net v3 3/4] rxrpc: Improve setsockopt() handling of malformed user input 2024-11-19 13:31 [PATCH net v3 0/4] net: Fix some callers of copy_from_sockptr() Michal Luczaj 2024-11-19 13:31 ` [PATCH net v3 1/4] Bluetooth: Improve setsockopt() handling of malformed user input Michal Luczaj 2024-11-19 13:31 ` [PATCH net v3 2/4] llc: " Michal Luczaj @ 2024-11-19 13:31 ` Michal Luczaj 2024-11-19 13:31 ` [PATCH net v3 4/4] net: Comment copy_from_sockptr() explaining its behaviour Michal Luczaj ` (4 subsequent siblings) 7 siblings, 0 replies; 10+ messages in thread From: Michal Luczaj @ 2024-11-19 13:31 UTC (permalink / raw) To: Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz, David S. Miller, Eric Dumazet, Paolo Abeni, Simon Horman, David Howells, Marc Dionne Cc: Luiz Augusto von Dentz, linux-bluetooth, netdev, linux-afs, Jakub Kicinski, Michal Luczaj copy_from_sockptr() does not return negative value on error; instead, it reports the number of bytes that failed to copy. Since it's deprecated, switch to copy_safe_from_sockptr(). Note: Keeping the `optlen != sizeof(unsigned int)` check as copy_safe_from_sockptr() by itself would also accept optlen > sizeof(unsigned int). Which would allow a more lenient handling of inputs. Fixes: 17926a79320a ("[AF_RXRPC]: Provide secure RxRPC sockets for use by userspace and kernel both") Signed-off-by: Michal Luczaj <mhal@rbox.co> --- net/rxrpc/af_rxrpc.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/net/rxrpc/af_rxrpc.c b/net/rxrpc/af_rxrpc.c index f4844683e12039d636253cb06f622468593487eb..9d8bd0b37e41da9f99e2661ae4a29569f5eab650 100644 --- a/net/rxrpc/af_rxrpc.c +++ b/net/rxrpc/af_rxrpc.c @@ -707,9 +707,10 @@ static int rxrpc_setsockopt(struct socket *sock, int level, int optname, ret = -EISCONN; if (rx->sk.sk_state != RXRPC_UNBOUND) goto error; - ret = copy_from_sockptr(&min_sec_level, optval, - sizeof(unsigned int)); - if (ret < 0) + ret = copy_safe_from_sockptr(&min_sec_level, + sizeof(min_sec_level), + optval, optlen); + if (ret) goto error; ret = -EINVAL; if (min_sec_level > RXRPC_SECURITY_MAX) -- 2.46.2 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH net v3 4/4] net: Comment copy_from_sockptr() explaining its behaviour 2024-11-19 13:31 [PATCH net v3 0/4] net: Fix some callers of copy_from_sockptr() Michal Luczaj ` (2 preceding siblings ...) 2024-11-19 13:31 ` [PATCH net v3 3/4] rxrpc: " Michal Luczaj @ 2024-11-19 13:31 ` Michal Luczaj 2024-11-26 9:00 ` [PATCH net v3 0/4] net: Fix some callers of copy_from_sockptr() Paolo Abeni ` (3 subsequent siblings) 7 siblings, 0 replies; 10+ messages in thread From: Michal Luczaj @ 2024-11-19 13:31 UTC (permalink / raw) To: Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz, David S. Miller, Eric Dumazet, Paolo Abeni, Simon Horman, David Howells, Marc Dionne Cc: Luiz Augusto von Dentz, linux-bluetooth, netdev, linux-afs, Jakub Kicinski, Michal Luczaj copy_from_sockptr() has a history of misuse. Add a comment explaining that the function follows API of copy_from_user(), i.e. returns 0 for success, or number of bytes not copied on error. Signed-off-by: Michal Luczaj <mhal@rbox.co> --- include/linux/sockptr.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/linux/sockptr.h b/include/linux/sockptr.h index 195debe2b1dbc5abf768aa806eb6c73b99421e27..3e6c8e9d67aef66e8ac5a4e474c278ac08244163 100644 --- a/include/linux/sockptr.h +++ b/include/linux/sockptr.h @@ -53,6 +53,8 @@ static inline int copy_from_sockptr_offset(void *dst, sockptr_t src, /* Deprecated. * This is unsafe, unless caller checked user provided optlen. * Prefer copy_safe_from_sockptr() instead. + * + * Returns 0 for success, or number of bytes not copied on error. */ static inline int copy_from_sockptr(void *dst, sockptr_t src, size_t size) { -- 2.46.2 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH net v3 0/4] net: Fix some callers of copy_from_sockptr() 2024-11-19 13:31 [PATCH net v3 0/4] net: Fix some callers of copy_from_sockptr() Michal Luczaj ` (3 preceding siblings ...) 2024-11-19 13:31 ` [PATCH net v3 4/4] net: Comment copy_from_sockptr() explaining its behaviour Michal Luczaj @ 2024-11-26 9:00 ` Paolo Abeni 2024-11-26 14:57 ` Luiz Augusto von Dentz 2024-11-28 8:30 ` patchwork-bot+netdevbpf ` (2 subsequent siblings) 7 siblings, 1 reply; 10+ messages in thread From: Paolo Abeni @ 2024-11-26 9:00 UTC (permalink / raw) To: Michal Luczaj, Luiz Augusto von Dentz, David Howells Cc: Luiz Augusto von Dentz, linux-bluetooth, netdev, linux-afs, Jakub Kicinski, David Wei, Marcel Holtmann, Johan Hedberg, David S. Miller, Eric Dumazet, Simon Horman, Marc Dionne On 11/19/24 14:31, Michal Luczaj wrote: > Some callers misinterpret copy_from_sockptr()'s return value. The function > follows copy_from_user(), i.e. returns 0 for success, or the number of > bytes not copied on error. Simply returning the result in a non-zero case > isn't usually what was intended. > > Compile tested with CONFIG_LLC, CONFIG_AF_RXRPC, CONFIG_BT enabled. > > Last patch probably belongs more to net-next, if any. Here as an RFC. > > Suggested-by: Jakub Kicinski <kuba@kernel.org> > Signed-off-by: Michal Luczaj <mhal@rbox.co> > --- > Changes in v3: > - rxrpc/llc: Drop the non-essential changes > - rxrpc/llc: Replace the deprecated copy_from_sockptr() with > copy_safe_from_sockptr() [David Wei] > - Collect Reviewed-by [David Wei] > - Link to v2: https://lore.kernel.org/r/20241115-sockptr-copy-fixes-v2-0-9b1254c18b7a@rbox.co > > Changes in v2: > - Fix the fix of llc_ui_setsockopt() > - Switch "bluetooth:" to "Bluetooth:" [bluez.test.bot] > - Collect Reviewed-by [Luiz Augusto von Dentz] > - Link to v1: https://lore.kernel.org/r/20241115-sockptr-copy-fixes-v1-0-d183c87fcbd5@rbox.co > > --- > Michal Luczaj (4): > Bluetooth: Improve setsockopt() handling of malformed user input > llc: Improve setsockopt() handling of malformed user input > rxrpc: Improve setsockopt() handling of malformed user input > net: Comment copy_from_sockptr() explaining its behaviour I guess we can apply directly patch 2-4, but patch 1 should go via the BT tree. @Luiz, @David, are you ok with that? Thanks, Paolo ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net v3 0/4] net: Fix some callers of copy_from_sockptr() 2024-11-26 9:00 ` [PATCH net v3 0/4] net: Fix some callers of copy_from_sockptr() Paolo Abeni @ 2024-11-26 14:57 ` Luiz Augusto von Dentz 0 siblings, 0 replies; 10+ messages in thread From: Luiz Augusto von Dentz @ 2024-11-26 14:57 UTC (permalink / raw) To: Paolo Abeni Cc: Michal Luczaj, David Howells, Luiz Augusto von Dentz, linux-bluetooth, netdev, linux-afs, Jakub Kicinski, David Wei, Marcel Holtmann, Johan Hedberg, David S. Miller, Eric Dumazet, Simon Horman, Marc Dionne Hi Paolo, On Tue, Nov 26, 2024 at 4:00 AM Paolo Abeni <pabeni@redhat.com> wrote: > > On 11/19/24 14:31, Michal Luczaj wrote: > > Some callers misinterpret copy_from_sockptr()'s return value. The function > > follows copy_from_user(), i.e. returns 0 for success, or the number of > > bytes not copied on error. Simply returning the result in a non-zero case > > isn't usually what was intended. > > > > Compile tested with CONFIG_LLC, CONFIG_AF_RXRPC, CONFIG_BT enabled. > > > > Last patch probably belongs more to net-next, if any. Here as an RFC. > > > > Suggested-by: Jakub Kicinski <kuba@kernel.org> > > Signed-off-by: Michal Luczaj <mhal@rbox.co> > > --- > > Changes in v3: > > - rxrpc/llc: Drop the non-essential changes > > - rxrpc/llc: Replace the deprecated copy_from_sockptr() with > > copy_safe_from_sockptr() [David Wei] > > - Collect Reviewed-by [David Wei] > > - Link to v2: https://lore.kernel.org/r/20241115-sockptr-copy-fixes-v2-0-9b1254c18b7a@rbox.co > > > > Changes in v2: > > - Fix the fix of llc_ui_setsockopt() > > - Switch "bluetooth:" to "Bluetooth:" [bluez.test.bot] > > - Collect Reviewed-by [Luiz Augusto von Dentz] > > - Link to v1: https://lore.kernel.org/r/20241115-sockptr-copy-fixes-v1-0-d183c87fcbd5@rbox.co > > > > --- > > Michal Luczaj (4): > > Bluetooth: Improve setsockopt() handling of malformed user input > > llc: Improve setsockopt() handling of malformed user input > > rxrpc: Improve setsockopt() handling of malformed user input > > net: Comment copy_from_sockptr() explaining its behaviour > > I guess we can apply directly patch 2-4, but patch 1 should go via the > BT tree. @Luiz, @David, are you ok with that? Sure, I can apply that one if there is no dependency on the others. > Thanks, > > Paolo > -- Luiz Augusto von Dentz ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net v3 0/4] net: Fix some callers of copy_from_sockptr() 2024-11-19 13:31 [PATCH net v3 0/4] net: Fix some callers of copy_from_sockptr() Michal Luczaj ` (4 preceding siblings ...) 2024-11-26 9:00 ` [PATCH net v3 0/4] net: Fix some callers of copy_from_sockptr() Paolo Abeni @ 2024-11-28 8:30 ` patchwork-bot+netdevbpf 2024-11-29 17:04 ` [PATCH net v3 3/4] rxrpc: Improve setsockopt() handling of malformed user input David Howells 2024-12-02 21:40 ` [PATCH net v3 0/4] net: Fix some callers of copy_from_sockptr() patchwork-bot+bluetooth 7 siblings, 0 replies; 10+ messages in thread From: patchwork-bot+netdevbpf @ 2024-11-28 8:30 UTC (permalink / raw) To: Michal Luczaj Cc: marcel, johan.hedberg, luiz.dentz, davem, edumazet, pabeni, horms, dhowells, marc.dionne, luiz.von.dentz, linux-bluetooth, netdev, linux-afs, kuba, dw Hello: This series was applied to netdev/net.git (main) by Paolo Abeni <pabeni@redhat.com>: On Tue, 19 Nov 2024 14:31:39 +0100 you wrote: > Some callers misinterpret copy_from_sockptr()'s return value. The function > follows copy_from_user(), i.e. returns 0 for success, or the number of > bytes not copied on error. Simply returning the result in a non-zero case > isn't usually what was intended. > > Compile tested with CONFIG_LLC, CONFIG_AF_RXRPC, CONFIG_BT enabled. > > [...] Here is the summary with links: - [net,v3,1/4] Bluetooth: Improve setsockopt() handling of malformed user input (no matching commit) - [net,v3,2/4] llc: Improve setsockopt() handling of malformed user input https://git.kernel.org/netdev/net/c/1465036b10be - [net,v3,3/4] rxrpc: Improve setsockopt() handling of malformed user input https://git.kernel.org/netdev/net/c/020200566470 - [net,v3,4/4] net: Comment copy_from_sockptr() explaining its behaviour https://git.kernel.org/netdev/net/c/49b2b973325a You are awesome, thank you! -- Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net v3 3/4] rxrpc: Improve setsockopt() handling of malformed user input 2024-11-19 13:31 [PATCH net v3 0/4] net: Fix some callers of copy_from_sockptr() Michal Luczaj ` (5 preceding siblings ...) 2024-11-28 8:30 ` patchwork-bot+netdevbpf @ 2024-11-29 17:04 ` David Howells 2024-12-02 21:40 ` [PATCH net v3 0/4] net: Fix some callers of copy_from_sockptr() patchwork-bot+bluetooth 7 siblings, 0 replies; 10+ messages in thread From: David Howells @ 2024-11-29 17:04 UTC (permalink / raw) To: Michal Luczaj Cc: dhowells, Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz, David S. Miller, Eric Dumazet, Paolo Abeni, Simon Horman, Marc Dionne, Luiz Augusto von Dentz, linux-bluetooth, netdev, linux-afs, Jakub Kicinski Michal Luczaj <mhal@rbox.co> wrote: > copy_from_sockptr() does not return negative value on error; instead, it > reports the number of bytes that failed to copy. Since it's deprecated, > switch to copy_safe_from_sockptr(). > > Note: Keeping the `optlen != sizeof(unsigned int)` check as > copy_safe_from_sockptr() by itself would also accept > optlen > sizeof(unsigned int). Which would allow a more lenient handling > of inputs. > > Fixes: 17926a79320a ("[AF_RXRPC]: Provide secure RxRPC sockets for use by userspace and kernel both") > Signed-off-by: Michal Luczaj <mhal@rbox.co> Acked-by: David Howells <dhowells@redhat.com> ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net v3 0/4] net: Fix some callers of copy_from_sockptr() 2024-11-19 13:31 [PATCH net v3 0/4] net: Fix some callers of copy_from_sockptr() Michal Luczaj ` (6 preceding siblings ...) 2024-11-29 17:04 ` [PATCH net v3 3/4] rxrpc: Improve setsockopt() handling of malformed user input David Howells @ 2024-12-02 21:40 ` patchwork-bot+bluetooth 7 siblings, 0 replies; 10+ messages in thread From: patchwork-bot+bluetooth @ 2024-12-02 21:40 UTC (permalink / raw) To: Michal Luczaj Cc: marcel, johan.hedberg, luiz.dentz, davem, edumazet, pabeni, horms, dhowells, marc.dionne, luiz.von.dentz, linux-bluetooth, netdev, linux-afs, kuba, dw Hello: This series was applied to bluetooth/bluetooth-next.git (master) by Luiz Augusto von Dentz <luiz.von.dentz@intel.com>: On Tue, 19 Nov 2024 14:31:39 +0100 you wrote: > Some callers misinterpret copy_from_sockptr()'s return value. The function > follows copy_from_user(), i.e. returns 0 for success, or the number of > bytes not copied on error. Simply returning the result in a non-zero case > isn't usually what was intended. > > Compile tested with CONFIG_LLC, CONFIG_AF_RXRPC, CONFIG_BT enabled. > > [...] Here is the summary with links: - [net,v3,1/4] Bluetooth: Improve setsockopt() handling of malformed user input https://git.kernel.org/bluetooth/bluetooth-next/c/389eeaf59809 - [net,v3,2/4] llc: Improve setsockopt() handling of malformed user input (no matching commit) - [net,v3,3/4] rxrpc: Improve setsockopt() handling of malformed user input (no matching commit) - [net,v3,4/4] net: Comment copy_from_sockptr() explaining its behaviour (no matching commit) You are awesome, thank you! -- Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2024-12-02 21:40 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-11-19 13:31 [PATCH net v3 0/4] net: Fix some callers of copy_from_sockptr() Michal Luczaj 2024-11-19 13:31 ` [PATCH net v3 1/4] Bluetooth: Improve setsockopt() handling of malformed user input Michal Luczaj 2024-11-19 13:31 ` [PATCH net v3 2/4] llc: " Michal Luczaj 2024-11-19 13:31 ` [PATCH net v3 3/4] rxrpc: " Michal Luczaj 2024-11-19 13:31 ` [PATCH net v3 4/4] net: Comment copy_from_sockptr() explaining its behaviour Michal Luczaj 2024-11-26 9:00 ` [PATCH net v3 0/4] net: Fix some callers of copy_from_sockptr() Paolo Abeni 2024-11-26 14:57 ` Luiz Augusto von Dentz 2024-11-28 8:30 ` patchwork-bot+netdevbpf 2024-11-29 17:04 ` [PATCH net v3 3/4] rxrpc: Improve setsockopt() handling of malformed user input David Howells 2024-12-02 21:40 ` [PATCH net v3 0/4] net: Fix some callers of copy_from_sockptr() patchwork-bot+bluetooth
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).