[PATCH net] can: netlink: fix CAN XL PWM attribute sizing

From: Zhu Ling

Date: Fri Sep 04 2026 - 12:43:36 EST


can_pwm_fill_info() emits the PWM capability limits whenever pwm_const is
present, regardless of whether TMS is enabled. In contrast,
can_pwm_get_size() currently returns zero when TMS is disabled. It
therefore underestimates the required netlink message size by the nested
attribute header and six u32 attributes.

Always account for the PWM capability attributes when pwm_const is
present, and account for the three runtime PWM values only when TMS is
enabled.

Fixes: 46552323fa67 ("can: netlink: add PWM netlink interface")
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Zhu Ling <zhuling0805@xxxxxx>
---
drivers/net/can/dev/netlink.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c
index 766d455950f5..0eac5a3f577e 100644
--- a/drivers/net/can/dev/netlink.c
+++ b/drivers/net/can/dev/netlink.c
@@ -780,7 +780,7 @@ static size_t can_pwm_get_size(const struct can_pwm_const *pwm_const,
{
size_t size;

- if (!pwm_const || !pwm_on)
+ if (!pwm_const)
return 0;

size = nla_total_size(0); /* nest IFLA_CAN_PWM */
@@ -792,9 +792,11 @@ static size_t can_pwm_get_size(const struct can_pwm_const *pwm_const,
size += nla_total_size(sizeof(u32)); /* IFLA_CAN_PWM_PWMO_MIN */
size += nla_total_size(sizeof(u32)); /* IFLA_CAN_PWM_PWMO_MAX */

- size += nla_total_size(sizeof(u32)); /* IFLA_CAN_PWM_PWMS */
- size += nla_total_size(sizeof(u32)); /* IFLA_CAN_PWM_PWML */
- size += nla_total_size(sizeof(u32)); /* IFLA_CAN_PWM_PWMO */
+ if (pwm_on) {
+ size += nla_total_size(sizeof(u32)); /* IFLA_CAN_PWM_PWMS */
+ size += nla_total_size(sizeof(u32)); /* IFLA_CAN_PWM_PWML */
+ size += nla_total_size(sizeof(u32)); /* IFLA_CAN_PWM_PWMO */
+ }

return size;
}

base-commit: 641d03105cc0d2437e32fdeec164f91a4ccef6c4
--
2.43.0