staging: dgnc: missing NULL check for ioremap in dgnc_do_remap()
authorDaeseok Youn <daeseok.youn@gmail.com>
Mon, 26 Sep 2016 00:40:58 +0000 (09:40 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 27 Sep 2016 11:12:25 +0000 (13:12 +0200)
The ioremap() function can be failed, so it need to have error
handling in dgnc_do_remap(). And also the return type of
dgnc_do_remap() should be changed from "void" to "int"

Signed-off-by: Daeseok Youn <daeseok.youn@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/dgnc/dgnc_driver.c

index c87b3def6ed87e4d73b24fe9168df52a81afe61c..58cebf425e36f7dfc459902241555c13b2b5e355 100644 (file)
@@ -43,7 +43,7 @@ static void           dgnc_cleanup_board(struct dgnc_board *brd);
 static void            dgnc_poll_handler(ulong dummy);
 static int             dgnc_init_one(struct pci_dev *pdev,
                                      const struct pci_device_id *ent);
-static void            dgnc_do_remap(struct dgnc_board *brd);
+static int             dgnc_do_remap(struct dgnc_board *brd);
 
 /*
  * File operations permitted on Control/Management major.
@@ -431,7 +431,10 @@ static int dgnc_found_board(struct pci_dev *pdev, int id)
                brd->bd_uart_offset = 0x8;
                brd->bd_dividend = 921600;
 
-               dgnc_do_remap(brd);
+               rc = dgnc_do_remap(brd);
+
+               if (rc < 0)
+                       goto failed;
 
                /* Get and store the board VPD, if it exists */
                brd->bd_ops->vpd(brd);
@@ -483,15 +486,17 @@ static int dgnc_found_board(struct pci_dev *pdev, int id)
                brd->bd_uart_offset = 0x200;
                brd->bd_dividend = 921600;
 
-               dgnc_do_remap(brd);
+               rc = dgnc_do_remap(brd);
 
-               if (brd->re_map_membase) {
-                       /* Read and store the dvid after remapping */
-                       brd->dvid = readb(brd->re_map_membase + 0x8D);
+               if (rc < 0)
+                       goto failed;
+
+               /* Read and store the dvid after remapping */
+               brd->dvid = readb(brd->re_map_membase + 0x8D);
+
+               /* Get and store the board VPD, if it exists */
+               brd->bd_ops->vpd(brd);
 
-                       /* Get and store the board VPD, if it exists */
-                       brd->bd_ops->vpd(brd);
-               }
                break;
 
        default:
@@ -566,9 +571,15 @@ static int dgnc_finalize_board_init(struct dgnc_board *brd)
 /*
  * Remap PCI memory.
  */
-static void dgnc_do_remap(struct dgnc_board *brd)
+static int dgnc_do_remap(struct dgnc_board *brd)
 {
+       int rc = 0;
+
        brd->re_map_membase = ioremap(brd->membase, 0x1000);
+       if (!brd->re_map_membase)
+               rc = -ENOMEM;
+
+       return rc;
 }
 
 /*