usage of cleanup attributes is discouraged in net [1], achieve cleanup
using goto. In this patch though, only uninitialized pointers with __free
attribute are cleaned as they can cause undefined behavior when they
go out of scope
Suggested-by: Simon Horman <horms@kernel.org>
Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
Closes: https://lore.kernel.org/all/aPiG_F5EBQUjZqsl@stanley.mountain/
Signed-off-by: Ally Heev <allyheev@gmail.com>
[1] https://docs.kernel.org/process/maintainer-netdev.html#using-device-managed-and-cleanup-h-constructs
Signed-off-by: Ally Heev <allyheev@gmail.com>
---
drivers/net/ethernet/intel/idpf/idpf_virtchnl.c | 28 +++++++++++++++++--------
1 file changed, 19 insertions(+), 9 deletions(-)
diff --git a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
index cbb5fa30f5a0ec778c1ee30470da3ca21cc1af24..5b2bf8c3205bc1ea0746f78afa2a24f3f8ad2a8c 100644
--- a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
+++ b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
@@ -1012,7 +1012,7 @@ static int idpf_send_get_caps_msg(struct idpf_adapter *adapter)
*/
static int idpf_send_get_lan_memory_regions(struct idpf_adapter *adapter)
{
- struct virtchnl2_get_lan_memory_regions *rcvd_regions __free(kfree);
+ struct virtchnl2_get_lan_memory_regions *rcvd_regions = NULL;
struct idpf_vc_xn_params xn_params = {
.vc_op = VIRTCHNL2_OP_GET_LAN_MEMORY_REGIONS,
.recv_buf.iov_len = IDPF_CTLQ_MAX_BUF_LEN,
@@ -1029,21 +1029,29 @@ static int idpf_send_get_lan_memory_regions(struct idpf_adapter *adapter)
xn_params.recv_buf.iov_base = rcvd_regions;
reply_sz = idpf_vc_xn_exec(adapter, &xn_params);
- if (reply_sz < 0)
- return reply_sz;
+ if (reply_sz < 0) {
+ err = reply_sz;
+ goto out;
+ }
num_regions = le16_to_cpu(rcvd_regions->num_memory_regions);
size = struct_size(rcvd_regions, mem_reg, num_regions);
- if (reply_sz < size)
- return -EIO;
+ if (reply_sz < size) {
+ err = -EIO;
+ goto out;
+ }
- if (size > IDPF_CTLQ_MAX_BUF_LEN)
- return -EINVAL;
+ if (size > IDPF_CTLQ_MAX_BUF_LEN) {
+ err = -EINVAL;
+ goto out;
+ }
hw = &adapter->hw;
hw->lan_regs = kcalloc(num_regions, sizeof(*hw->lan_regs), GFP_KERNEL);
- if (!hw->lan_regs)
- return -ENOMEM;
+ if (!hw->lan_regs) {
+ err = -ENOMEM;
+ goto out;
+ }
for (int i = 0; i < num_regions; i++) {
hw->lan_regs[i].addr_len =
@@ -1053,6 +1061,8 @@ static int idpf_send_get_lan_memory_regions(struct idpf_adapter *adapter)
}
hw->num_lan_regs = num_regions;
+out:
+ kfree(rcvd_regions);
return err;
}
--
2.47.3
> -----Original Message-----
> From: Intel-wired-lan <intel-wired-lan-bounces@osuosl.org> On Behalf
> Of Ally Heev
> Sent: Monday, November 24, 2025 8:41 AM
> To: Nguyen, Anthony L <anthony.l.nguyen@intel.com>; Kitszel,
> Przemyslaw <przemyslaw.kitszel@intel.com>; Andrew Lunn
> <andrew+netdev@lunn.ch>; David S. Miller <davem@davemloft.net>; Eric
> Dumazet <edumazet@google.com>; Jakub Kicinski <kuba@kernel.org>; Paolo
> Abeni <pabeni@redhat.com>
> Cc: intel-wired-lan@lists.osuosl.org; netdev@vger.kernel.org; linux-
> kernel@vger.kernel.org; Ally Heev <allyheev@gmail.com>; Simon Horman
> <horms@kernel.org>; Dan Carpenter <dan.carpenter@linaro.org>
> Subject: [Intel-wired-lan] [PATCH RESEND RFT net-next 2/2] idpf:
> remove __free usage in idpf_virtchnl
>
> usage of cleanup attributes is discouraged in net [1], achieve cleanup
> using goto. In this patch though, only uninitialized pointers with
> __free attribute are cleaned as they can cause undefined behavior when
> they go out of scope
>
> Suggested-by: Simon Horman <horms@kernel.org>
> Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
> Closes: https://lore.kernel.org/all/aPiG_F5EBQUjZqsl@stanley.mountain/
> Signed-off-by: Ally Heev <allyheev@gmail.com>
>
> [1] https://docs.kernel.org/process/maintainer-netdev.html#using-
> device-managed-and-cleanup-h-constructs
>
> Signed-off-by: Ally Heev <allyheev@gmail.com>
> ---
> drivers/net/ethernet/intel/idpf/idpf_virtchnl.c | 28
> +++++++++++++++++--------
> 1 file changed, 19 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
> b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
> index
> cbb5fa30f5a0ec778c1ee30470da3ca21cc1af24..5b2bf8c3205bc1ea0746f78afa2a
> 24f3f8ad2a8c 100644
> --- a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
> +++ b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
> @@ -1012,7 +1012,7 @@ static int idpf_send_get_caps_msg(struct
> idpf_adapter *adapter)
> */
> static int idpf_send_get_lan_memory_regions(struct idpf_adapter
> *adapter) {
> - struct virtchnl2_get_lan_memory_regions *rcvd_regions
> __free(kfree);
> + struct virtchnl2_get_lan_memory_regions *rcvd_regions = NULL;
> struct idpf_vc_xn_params xn_params = {
> .vc_op = VIRTCHNL2_OP_GET_LAN_MEMORY_REGIONS,
> .recv_buf.iov_len = IDPF_CTLQ_MAX_BUF_LEN, @@ -1029,21
> +1029,29 @@ static int idpf_send_get_lan_memory_regions(struct
> idpf_adapter *adapter)
>
> xn_params.recv_buf.iov_base = rcvd_regions;
> reply_sz = idpf_vc_xn_exec(adapter, &xn_params);
> - if (reply_sz < 0)
> - return reply_sz;
> + if (reply_sz < 0) {
> + err = reply_sz;
> + goto out;
> + }
>
> num_regions = le16_to_cpu(rcvd_regions->num_memory_regions);
> size = struct_size(rcvd_regions, mem_reg, num_regions);
> - if (reply_sz < size)
> - return -EIO;
> + if (reply_sz < size) {
> + err = -EIO;
> + goto out;
> + }
>
> - if (size > IDPF_CTLQ_MAX_BUF_LEN)
> - return -EINVAL;
> + if (size > IDPF_CTLQ_MAX_BUF_LEN) {
> + err = -EINVAL;
> + goto out;
> + }
>
> hw = &adapter->hw;
> hw->lan_regs = kcalloc(num_regions, sizeof(*hw->lan_regs),
> GFP_KERNEL);
> - if (!hw->lan_regs)
> - return -ENOMEM;
> + if (!hw->lan_regs) {
> + err = -ENOMEM;
> + goto out;
> + }
>
> for (int i = 0; i < num_regions; i++) {
> hw->lan_regs[i].addr_len =
> @@ -1053,6 +1061,8 @@ static int
> idpf_send_get_lan_memory_regions(struct idpf_adapter *adapter)
> }
> hw->num_lan_regs = num_regions;
>
> +out:
> + kfree(rcvd_regions);
> return err;
> }
>
>
> --
> 2.47.3
Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
© 2016 - 2025 Red Hat, Inc.