From: Markus Elfring <elfring@xxxxxxxxxxxxxxxxxxxxx> Date: Fri, 28 Jun 2024 08:25:34 +0200 The API documentation for the function “device_get_named_child_node” contains the following information: “… The caller is responsible for calling fwnode_handle_put() on the returned fwnode pointer. …” The mentioned requirement was not fulfilled so that a resource leak will occur in some error cases after a device_get_named_child_node() call succeeded in this function implementation. Thus apply scope-based resource management which became supported also for this programming interface by contributions of Jonathan Cameron on 2024-02-17. See also the commit 59ed5e2d505bf5f9b4af64d0021cd0c96aec1f7c ("device property: Add cleanup.h based fwnode_handle_put() scope based cleanup."). * Use the attribute “__free(fwnode_handle)” accordingly. * Reduce the scope for the local variable “fwnode”. Cc: stable@xxxxxxxxxxxxxxx Fixes: fe6d8a9c8e64 ("usb: typec: anx7411: Add Analogix PD ANX7411 support") Reviewed-by: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx> Signed-off-by: Markus Elfring <elfring@xxxxxxxxxxxxxxxxxxxxx> --- V2: * The change description was extended as requested by patch reviewers. * The tag “Reviewed-by” was added according to feedback by Heikki Krogerus. * A “stable tag” was added. V1: Initial patch review https://lore.kernel.org/r/889729ac-3fc5-4666-b9f5-ce6e588a341a@xxxxxx/ https://lkml.org/lkml/2024/6/5/1276 I guess that clarifications can become interesting also for backporting concerns because of the proposed software transformation. drivers/usb/typec/anx7411.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/usb/typec/anx7411.c b/drivers/usb/typec/anx7411.c index b12a07edc71b..9fb52f233a30 100644 --- a/drivers/usb/typec/anx7411.c +++ b/drivers/usb/typec/anx7411.c @@ -16,6 +16,7 @@ #include <linux/of_graph.h> #include <linux/of_platform.h> #include <linux/pm_runtime.h> +#include <linux/property.h> #include <linux/regulator/consumer.h> #include <linux/slab.h> #include <linux/types.h> @@ -1142,11 +1143,11 @@ static int anx7411_typec_port_probe(struct anx7411_data *ctx, { struct typec_capability *cap = &ctx->typec.caps; struct typec_params *typecp = &ctx->typec; - struct fwnode_handle *fwnode; const char *buf; int ret, i; - fwnode = device_get_named_child_node(dev, "connector"); + struct fwnode_handle *fwnode __free(fwnode_handle) + = device_get_named_child_node(dev, "connector"); if (!fwnode) return -EINVAL; @@ -1237,7 +1238,7 @@ static int anx7411_typec_port_probe(struct anx7411_data *ctx, typecp->caps_flags |= HAS_SINK_WATT; } - cap->fwnode = fwnode; + cap->fwnode = no_free_ptr(fwnode); ctx->typec.role_sw = usb_role_switch_get(dev); if (IS_ERR(ctx->typec.role_sw)) { -- 2.45.2