Re: [PATCH v7 13/16] power: sequencing: implement the pwrseq core

Simon Horman
2024-04-14T10:39:36Z

On Wed, Apr 10, 2024 at 02:46:25PM +0200, Bartosz Golaszewski wrote:

...

> +/**
> + * pwrseq_device_register() - Register a new power sequencer.
> + * @config: Configuration of the new power sequencing device.
> + *
> + * The config structure is only used during the call and can be freed after
> + * the function returns. The config structure *must* have the parent device
> + * as well as the match() callback and at least one target set.
> + *
> + * Returns:
> + * Returns the address of the new pwrseq device or ERR_PTR() on failure.
> + */
> +struct pwrseq_device *
> +pwrseq_device_register(const struct pwrseq_config *config)
> +{
> + struct pwrseq_device *pwrseq;
> + int ret;
> +
> + if (!config->parent || !config->match || !config->targets ||
> + !config->targets[0])
> + return ERR_PTR(-EINVAL);
> +
> + pwrseq = kzalloc(sizeof(*pwrseq), GFP_KERNEL);
> + if (!pwrseq)
> + return ERR_PTR(-ENOMEM);
> +
> + pwrseq->dev.type = &pwrseq_device_type;
> + pwrseq->dev.bus = &pwrseq_bus;
> + pwrseq->dev.parent = config->parent;
> + device_set_node(&pwrseq->dev, dev_fwnode(config->parent));
> + dev_set_drvdata(&pwrseq->dev, config->drvdata);
> +
> + pwrseq->id = ida_alloc(&pwrseq_ida, GFP_KERNEL);
> + if (pwrseq->id < 0) {
> + kfree(pwrseq);

Hi Bartosz,

pwrseq is freed on the line above,
so it should not be dereferenced on the line below.

Flagged by Smatch.

> + return ERR_PTR(pwrseq->id);
> + }

...