Skip to content

Commit 37e9981

Browse files
Joelgranadosmcgrof
authored andcommitted
parport: plug a sysctl register leak
parport registers two sysctl directories in the parport_proc_register function but only one of them was getting unregistered in parport_proc_unregister. Keep track of both sysctl table headers and handle them together when (un)registering. Signed-off-by: Joel Granados <j.granados@samsung.com> Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
1 parent 28898e2 commit 37e9981

1 file changed

Lines changed: 12 additions & 10 deletions

File tree

drivers/parport/procfs.c

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -257,14 +257,16 @@ PARPORT_MAX_SPINTIME_VALUE;
257257

258258

259259
struct parport_sysctl_table {
260-
struct ctl_table_header *sysctl_header;
260+
struct ctl_table_header *port_header;
261+
struct ctl_table_header *devices_header;
261262
struct ctl_table vars[12];
262263
struct ctl_table device_dir[2];
263264
};
264265

265266
static const struct parport_sysctl_table parport_sysctl_template = {
266-
.sysctl_header = NULL,
267-
{
267+
.port_header = NULL,
268+
.devices_header = NULL,
269+
{
268270
{
269271
.procname = "spintime",
270272
.data = NULL,
@@ -429,7 +431,6 @@ parport_default_sysctl_table = {
429431
int parport_proc_register(struct parport *port)
430432
{
431433
struct parport_sysctl_table *t;
432-
struct ctl_table_header *devices_h;
433434
char *tmp_dir_path;
434435
size_t tmp_path_len, port_name_len;
435436
int bytes_written, i, err = 0;
@@ -464,8 +465,8 @@ int parport_proc_register(struct parport *port)
464465
err = -ENOENT;
465466
goto exit_free_tmp_dir_path;
466467
}
467-
devices_h = register_sysctl(tmp_dir_path, t->device_dir);
468-
if (devices_h == NULL) {
468+
t->devices_header = register_sysctl(tmp_dir_path, t->device_dir);
469+
if (t->devices_header == NULL) {
469470
err = -ENOENT;
470471
goto exit_free_tmp_dir_path;
471472
}
@@ -478,8 +479,8 @@ int parport_proc_register(struct parport *port)
478479
goto unregister_devices_h;
479480
}
480481

481-
t->sysctl_header = register_sysctl(tmp_dir_path, t->vars);
482-
if (t->sysctl_header == NULL) {
482+
t->port_header = register_sysctl(tmp_dir_path, t->vars);
483+
if (t->port_header == NULL) {
483484
err = -ENOENT;
484485
goto unregister_devices_h;
485486
}
@@ -490,7 +491,7 @@ int parport_proc_register(struct parport *port)
490491
return 0;
491492

492493
unregister_devices_h:
493-
unregister_sysctl_table(devices_h);
494+
unregister_sysctl_table(t->devices_header);
494495

495496
exit_free_tmp_dir_path:
496497
kfree(tmp_dir_path);
@@ -505,7 +506,8 @@ int parport_proc_unregister(struct parport *port)
505506
if (port->sysctl_table) {
506507
struct parport_sysctl_table *t = port->sysctl_table;
507508
port->sysctl_table = NULL;
508-
unregister_sysctl_table(t->sysctl_header);
509+
unregister_sysctl_table(t->devices_header);
510+
unregister_sysctl_table(t->port_header);
509511
kfree(t);
510512
}
511513
return 0;

0 commit comments

Comments
 (0)