Skip to content

Commit c382064

Browse files
rfvirgilbroonie
authored andcommitted
regmap: kunit: Fix memory leaks in gen_regmap() and gen_raw_regmap()
- Use kunit_kcalloc() to allocate the defaults table so that it will be freed when the test case ends. - kfree() the buf and *data buffers on the error paths. - Use kunit_add_action_or_reset() instead of kunit_add_action() so that if it fails it will call regmap_exit(). Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com> Link: https://msgid.link/r/20240411103724.54063-1-rf@opensource.cirrus.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 1613e60 commit c382064

1 file changed

Lines changed: 45 additions & 27 deletions

File tree

drivers/base/regmap/regmap-kunit.c

Lines changed: 45 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,9 @@ static struct regmap *gen_regmap(struct kunit *test,
145145
const struct regmap_test_param *param = test->param_value;
146146
struct regmap_test_priv *priv = test->priv;
147147
unsigned int *buf;
148-
struct regmap *ret;
148+
struct regmap *ret = ERR_PTR(-ENOMEM);
149149
size_t size;
150-
int i;
150+
int i, error;
151151
struct reg_default *defaults;
152152

153153
config->cache_type = param->cache;
@@ -172,15 +172,17 @@ static struct regmap *gen_regmap(struct kunit *test,
172172

173173
*data = kzalloc(sizeof(**data), GFP_KERNEL);
174174
if (!(*data))
175-
return ERR_PTR(-ENOMEM);
175+
goto out_free;
176176
(*data)->vals = buf;
177177

178178
if (config->num_reg_defaults) {
179-
defaults = kcalloc(config->num_reg_defaults,
180-
sizeof(struct reg_default),
181-
GFP_KERNEL);
179+
defaults = kunit_kcalloc(test,
180+
config->num_reg_defaults,
181+
sizeof(struct reg_default),
182+
GFP_KERNEL);
182183
if (!defaults)
183-
return ERR_PTR(-ENOMEM);
184+
goto out_free;
185+
184186
config->reg_defaults = defaults;
185187

186188
for (i = 0; i < config->num_reg_defaults; i++) {
@@ -190,12 +192,19 @@ static struct regmap *gen_regmap(struct kunit *test,
190192
}
191193

192194
ret = regmap_init_ram(priv->dev, config, *data);
193-
if (IS_ERR(ret)) {
194-
kfree(buf);
195-
kfree(*data);
196-
} else {
197-
kunit_add_action(test, regmap_exit_action, ret);
198-
}
195+
if (IS_ERR(ret))
196+
goto out_free;
197+
198+
/* This calls regmap_exit() on failure, which frees buf and *data */
199+
error = kunit_add_action_or_reset(test, regmap_exit_action, ret);
200+
if (error)
201+
ret = ERR_PTR(error);
202+
203+
return ret;
204+
205+
out_free:
206+
kfree(buf);
207+
kfree(*data);
199208

200209
return ret;
201210
}
@@ -1497,9 +1506,9 @@ static struct regmap *gen_raw_regmap(struct kunit *test,
14971506
struct regmap_test_priv *priv = test->priv;
14981507
const struct regmap_test_param *param = test->param_value;
14991508
u16 *buf;
1500-
struct regmap *ret;
1509+
struct regmap *ret = ERR_PTR(-ENOMEM);
15011510
size_t size = (config->max_register + 1) * config->reg_bits / 8;
1502-
int i;
1511+
int i, error;
15031512
struct reg_default *defaults;
15041513

15051514
config->cache_type = param->cache;
@@ -1515,15 +1524,16 @@ static struct regmap *gen_raw_regmap(struct kunit *test,
15151524

15161525
*data = kzalloc(sizeof(**data), GFP_KERNEL);
15171526
if (!(*data))
1518-
return ERR_PTR(-ENOMEM);
1527+
goto out_free;
15191528
(*data)->vals = (void *)buf;
15201529

15211530
config->num_reg_defaults = config->max_register + 1;
1522-
defaults = kcalloc(config->num_reg_defaults,
1523-
sizeof(struct reg_default),
1524-
GFP_KERNEL);
1531+
defaults = kunit_kcalloc(test,
1532+
config->num_reg_defaults,
1533+
sizeof(struct reg_default),
1534+
GFP_KERNEL);
15251535
if (!defaults)
1526-
return ERR_PTR(-ENOMEM);
1536+
goto out_free;
15271537
config->reg_defaults = defaults;
15281538

15291539
for (i = 0; i < config->num_reg_defaults; i++) {
@@ -1536,7 +1546,8 @@ static struct regmap *gen_raw_regmap(struct kunit *test,
15361546
defaults[i].def = be16_to_cpu(buf[i]);
15371547
break;
15381548
default:
1539-
return ERR_PTR(-EINVAL);
1549+
ret = ERR_PTR(-EINVAL);
1550+
goto out_free;
15401551
}
15411552
}
15421553

@@ -1548,12 +1559,19 @@ static struct regmap *gen_raw_regmap(struct kunit *test,
15481559
config->num_reg_defaults = 0;
15491560

15501561
ret = regmap_init_raw_ram(priv->dev, config, *data);
1551-
if (IS_ERR(ret)) {
1552-
kfree(buf);
1553-
kfree(*data);
1554-
} else {
1555-
kunit_add_action(test, regmap_exit_action, ret);
1556-
}
1562+
if (IS_ERR(ret))
1563+
goto out_free;
1564+
1565+
/* This calls regmap_exit() on failure, which frees buf and *data */
1566+
error = kunit_add_action_or_reset(test, regmap_exit_action, ret);
1567+
if (error)
1568+
ret = ERR_PTR(error);
1569+
1570+
return ret;
1571+
1572+
out_free:
1573+
kfree(buf);
1574+
kfree(*data);
15571575

15581576
return ret;
15591577
}

0 commit comments

Comments
 (0)