Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
fork

Configure Feed

Select the types of activity you want to include in your feed.

ppdev: don't print a free'd string

A previous fix of a memory leak now prints the string 'name'
that was previously free'd. Fix this by free'ing the string
at the end of the function and adding an error exit path for
the error conditions.

CoverityScan CID#1384523 ("Use after free")

Fixes: 2bd362d5f45c1 ("ppdev: fix memory leak")
Signed-off-by: Colin Ian King <colin.king@canonical.com>
Acked-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Colin Ian King and committed by
Greg Kroah-Hartman
0fa2c8eb 5b11ebed

+8 -5
+8 -5
drivers/char/ppdev.c
··· 290 290 struct pardevice *pdev = NULL; 291 291 char *name; 292 292 struct pardev_cb ppdev_cb; 293 + int rc = 0; 293 294 294 295 name = kasprintf(GFP_KERNEL, CHRDEV "%x", minor); 295 296 if (name == NULL) ··· 299 298 port = parport_find_number(minor); 300 299 if (!port) { 301 300 pr_warn("%s: no associated port!\n", name); 302 - kfree(name); 303 - return -ENXIO; 301 + rc = -ENXIO; 302 + goto err; 304 303 } 305 304 306 305 memset(&ppdev_cb, 0, sizeof(ppdev_cb)); ··· 309 308 ppdev_cb.private = pp; 310 309 pdev = parport_register_dev_model(port, name, &ppdev_cb, minor); 311 310 parport_put_port(port); 312 - kfree(name); 313 311 314 312 if (!pdev) { 315 313 pr_warn("%s: failed to register device!\n", name); 316 - return -ENXIO; 314 + rc = -ENXIO; 315 + goto err; 317 316 } 318 317 319 318 pp->pdev = pdev; 320 319 dev_dbg(&pdev->dev, "registered pardevice\n"); 321 - return 0; 320 + err: 321 + kfree(name); 322 + return rc; 322 323 } 323 324 324 325 static enum ieee1284_phase init_phase(int mode)