[PATCH] staging: dgnc: Fix a possible crash when the class_create fails

devendranaga4 at gmail.com devendranaga4 at gmail.com
Mon Oct 13 16:56:54 UTC 2014


From: Devendra Naga <devendranaga4 at gmail.com>

The class_create function can return a pointer with an error code
stuffed inside it if it fails. Handled it to make sure
device_register doesn't get an invalid pointer.

Also removed assignment of rc to 0 in the beginning of function
because it gets changed after the call to register_chrdev function.

Signed-off-by: Devendra Naga <devendranaga4 at gmail.com>
---
 drivers/staging/dgnc/dgnc_driver.c |   12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/drivers/staging/dgnc/dgnc_driver.c b/drivers/staging/dgnc/dgnc_driver.c
index 2154665..72bfb29 100644
--- a/drivers/staging/dgnc/dgnc_driver.c
+++ b/drivers/staging/dgnc/dgnc_driver.c
@@ -248,7 +248,7 @@ module_exit(dgnc_cleanup_module);
  */
 static int dgnc_start(void)
 {
-	int rc = 0;
+	int rc;
 	unsigned long flags;
 
 	/* make sure that the globals are init'd before we do anything else */
@@ -271,6 +271,12 @@ static int dgnc_start(void)
 	dgnc_Major = rc;
 
 	dgnc_class = class_create(THIS_MODULE, "dgnc_mgmt");
+	if (IS_ERR(dgnc_class)) {
+		rc = PTR_ERR(dgnc_class);
+		APR(("Can't creat dgnc class (%d)\n", rc));
+		goto bad;
+	}
+
 	device_create(dgnc_class, NULL,
 		MKDEV(dgnc_Major, 0),
 		NULL, "dgnc_mgmt");
@@ -297,6 +303,10 @@ static int dgnc_start(void)
 	add_timer(&dgnc_poll_timer);
 
 	return rc;
+
+bad:
+	unregister_chrdev(dgnc_Major, "dgnc");
+	return rc;
 }
 
 /* returns count (>= 0), or negative on error */
-- 
1.7.9.5



More information about the devel mailing list