瀏覽代碼

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>
Colin Ian King 8 年之前
父節點
當前提交
0fa2c8eb27
共有 1 個文件被更改,包括 8 次插入5 次删除
  1. 8 5
      drivers/char/ppdev.c

+ 8 - 5
drivers/char/ppdev.c

@@ -290,6 +290,7 @@ static int register_device(int minor, struct pp_struct *pp)
 	struct pardevice *pdev = NULL;
 	struct pardevice *pdev = NULL;
 	char *name;
 	char *name;
 	struct pardev_cb ppdev_cb;
 	struct pardev_cb ppdev_cb;
+	int rc = 0;
 
 
 	name = kasprintf(GFP_KERNEL, CHRDEV "%x", minor);
 	name = kasprintf(GFP_KERNEL, CHRDEV "%x", minor);
 	if (name == NULL)
 	if (name == NULL)
@@ -298,8 +299,8 @@ static int register_device(int minor, struct pp_struct *pp)
 	port = parport_find_number(minor);
 	port = parport_find_number(minor);
 	if (!port) {
 	if (!port) {
 		pr_warn("%s: no associated port!\n", name);
 		pr_warn("%s: no associated port!\n", name);
-		kfree(name);
-		return -ENXIO;
+		rc = -ENXIO;
+		goto err;
 	}
 	}
 
 
 	memset(&ppdev_cb, 0, sizeof(ppdev_cb));
 	memset(&ppdev_cb, 0, sizeof(ppdev_cb));
@@ -308,16 +309,18 @@ static int register_device(int minor, struct pp_struct *pp)
 	ppdev_cb.private = pp;
 	ppdev_cb.private = pp;
 	pdev = parport_register_dev_model(port, name, &ppdev_cb, minor);
 	pdev = parport_register_dev_model(port, name, &ppdev_cb, minor);
 	parport_put_port(port);
 	parport_put_port(port);
-	kfree(name);
 
 
 	if (!pdev) {
 	if (!pdev) {
 		pr_warn("%s: failed to register device!\n", name);
 		pr_warn("%s: failed to register device!\n", name);
-		return -ENXIO;
+		rc = -ENXIO;
+		goto err;
 	}
 	}
 
 
 	pp->pdev = pdev;
 	pp->pdev = pdev;
 	dev_dbg(&pdev->dev, "registered pardevice\n");
 	dev_dbg(&pdev->dev, "registered pardevice\n");
-	return 0;
+err:
+	kfree(name);
+	return rc;
 }
 }
 
 
 static enum ieee1284_phase init_phase(int mode)
 static enum ieee1284_phase init_phase(int mode)