* [PATCH v2] net: nfc: nci: Fix parameter validation for packet data
@ 2025-12-10 8:16 Michael Thalmeier
2025-12-18 15:36 ` Paolo Abeni
0 siblings, 1 reply; 2+ messages in thread
From: Michael Thalmeier @ 2025-12-10 8:16 UTC (permalink / raw)
To: Deepak Sharma, Krzysztof Kozlowski, Vadim Fedorenko, Simon Horman
Cc: linux-kernel, netdev, Michael Thalmeier, stable
Since commit 9c328f54741b ("net: nfc: nci: Add parameter validation for
packet data") communication with nci nfc chips is not working any more.
The mentioned commit tries to fix access of uninitialized data, but
failed to understand that in some cases the data packet is of variable
length and can therefore not be compared to the maximum packet length
given by the sizeof(struct).
For these cases it is only possible to check for minimum packet length.
Fixes: 9c328f54741b ("net: nfc: nci: Add parameter validation for packet data")
Cc: stable@vger.kernel.org
Signed-off-by: Michael Thalmeier <michael.thalmeier@hale.at>
---
Changes in v2:
- Reference correct commit hash
---
net/nfc/nci/ntf.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/net/nfc/nci/ntf.c b/net/nfc/nci/ntf.c
index 418b84e2b260..5161e94f067f 100644
--- a/net/nfc/nci/ntf.c
+++ b/net/nfc/nci/ntf.c
@@ -58,7 +58,8 @@ static int nci_core_conn_credits_ntf_packet(struct nci_dev *ndev,
struct nci_conn_info *conn_info;
int i;
- if (skb->len < sizeof(struct nci_core_conn_credit_ntf))
+ /* Minimal packet size for num_entries=1 is 1 x __u8 + 1 x conn_credit_entry */
+ if (skb->len < (sizeof(__u8) + sizeof(struct conn_credit_entry)))
return -EINVAL;
ntf = (struct nci_core_conn_credit_ntf *)skb->data;
@@ -364,7 +365,8 @@ static int nci_rf_discover_ntf_packet(struct nci_dev *ndev,
const __u8 *data;
bool add_target = true;
- if (skb->len < sizeof(struct nci_rf_discover_ntf))
+ /* Minimal packet size is 5 if rf_tech_specific_params_len=0 */
+ if (skb->len < (5 * sizeof(__u8)))
return -EINVAL;
data = skb->data;
@@ -596,7 +598,10 @@ static int nci_rf_intf_activated_ntf_packet(struct nci_dev *ndev,
const __u8 *data;
int err = NCI_STATUS_OK;
- if (skb->len < sizeof(struct nci_rf_intf_activated_ntf))
+ /* Minimal packet size is 11 if
+ * f_tech_specific_params_len=0 and activation_params_len=0
+ */
+ if (skb->len < (11 * sizeof(__u8)))
return -EINVAL;
data = skb->data;
--
2.52.0
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH v2] net: nfc: nci: Fix parameter validation for packet data
2025-12-10 8:16 [PATCH v2] net: nfc: nci: Fix parameter validation for packet data Michael Thalmeier
@ 2025-12-18 15:36 ` Paolo Abeni
0 siblings, 0 replies; 2+ messages in thread
From: Paolo Abeni @ 2025-12-18 15:36 UTC (permalink / raw)
To: Michael Thalmeier, Deepak Sharma, Krzysztof Kozlowski,
Vadim Fedorenko, Simon Horman
Cc: linux-kernel, netdev, stable
On 12/10/25 9:16 AM, Michael Thalmeier wrote:
> Since commit 9c328f54741b ("net: nfc: nci: Add parameter validation for
> packet data") communication with nci nfc chips is not working any more.
>
> The mentioned commit tries to fix access of uninitialized data, but
> failed to understand that in some cases the data packet is of variable
> length and can therefore not be compared to the maximum packet length
> given by the sizeof(struct).
>
> For these cases it is only possible to check for minimum packet length.
>
> Fixes: 9c328f54741b ("net: nfc: nci: Add parameter validation for packet data")
> Cc: stable@vger.kernel.org
> Signed-off-by: Michael Thalmeier <michael.thalmeier@hale.at>
> ---
> Changes in v2:
> - Reference correct commit hash
Minor nit: you should include the target tree ('net' in this case) in
the subj prefix.
> net/nfc/nci/ntf.c | 11 ++++++++---
> 1 file changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/net/nfc/nci/ntf.c b/net/nfc/nci/ntf.c
> index 418b84e2b260..5161e94f067f 100644
> --- a/net/nfc/nci/ntf.c
> +++ b/net/nfc/nci/ntf.c
> @@ -58,7 +58,8 @@ static int nci_core_conn_credits_ntf_packet(struct nci_dev *ndev,
> struct nci_conn_info *conn_info;
> int i;
>
> - if (skb->len < sizeof(struct nci_core_conn_credit_ntf))
> + /* Minimal packet size for num_entries=1 is 1 x __u8 + 1 x conn_credit_entry */
> + if (skb->len < (sizeof(__u8) + sizeof(struct conn_credit_entry)))
> return -EINVAL;
You can still perform a complete check, splitting such operation in two
steps:
First ensure that input contains enough data to include the length
related field; after reading such field check the the length is valid
and the packet len matches it.
>
> ntf = (struct nci_core_conn_credit_ntf *)skb->data;
> @@ -364,7 +365,8 @@ static int nci_rf_discover_ntf_packet(struct nci_dev *ndev,
> const __u8 *data;
> bool add_target = true;
>
> - if (skb->len < sizeof(struct nci_rf_discover_ntf))
> + /* Minimal packet size is 5 if rf_tech_specific_params_len=0 */
> + if (skb->len < (5 * sizeof(__u8)))
Instead of using a magic number, you could/should use:
offsetof(struct nci_rf_discover_ntf, rf_tech_specific_params_len)
and will make the comment unneeded. Also the same consideration about
full validation apply here.
> return -EINVAL;
>
> data = skb->data;
> @@ -596,7 +598,10 @@ static int nci_rf_intf_activated_ntf_packet(struct nci_dev *ndev,
> const __u8 *data;
> int err = NCI_STATUS_OK;
>
> - if (skb->len < sizeof(struct nci_rf_intf_activated_ntf))
> + /* Minimal packet size is 11 if
> + * f_tech_specific_params_len=0 and activation_params_len=0
> + */
> + if (skb->len < (11 * sizeof(__u8)))
> return -EINVAL;
Again all the above applies here, too.
/P
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2025-12-18 15:36 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-12-10 8:16 [PATCH v2] net: nfc: nci: Fix parameter validation for packet data Michael Thalmeier
2025-12-18 15:36 ` Paolo Abeni
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®