bnx2x: fix memory leak in bnx2x_init_firmware()
authorMichal Schmidt <mschmidt@redhat.com>
Thu, 15 Mar 2012 14:08:29 +0000 (14:08 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 16 Mar 2012 08:57:26 +0000 (01:57 -0700)
When cycling the interface down and up, bnx2x_init_firmware() knows that
the firmware is already loaded, but nevertheless it allocates certain
arrays anew (init_data, init_ops, init_ops_offsets, iro_arr). The old
arrays are leaked.

Fix the leaks by returning early if the firmware was already loaded.
Because if the firmware is loaded, so are the arrays.

Signed-off-by: Michal Schmidt <mschmidt@redhat.com>
Acked-by: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c

index 00ff62f..b69f876 100644 (file)
@@ -10824,38 +10824,36 @@ do {                                                                  \
 
 int bnx2x_init_firmware(struct bnx2x *bp)
 {
+       const char *fw_file_name;
        struct bnx2x_fw_file_hdr *fw_hdr;
        int rc;
 
+       if (bp->firmware)
+               return 0;
 
-       if (!bp->firmware) {
-               const char *fw_file_name;
-
-               if (CHIP_IS_E1(bp))
-                       fw_file_name = FW_FILE_NAME_E1;
-               else if (CHIP_IS_E1H(bp))
-                       fw_file_name = FW_FILE_NAME_E1H;
-               else if (!CHIP_IS_E1x(bp))
-                       fw_file_name = FW_FILE_NAME_E2;
-               else {
-                       BNX2X_ERR("Unsupported chip revision\n");
-                       return -EINVAL;
-               }
-               BNX2X_DEV_INFO("Loading %s\n", fw_file_name);
+       if (CHIP_IS_E1(bp))
+               fw_file_name = FW_FILE_NAME_E1;
+       else if (CHIP_IS_E1H(bp))
+               fw_file_name = FW_FILE_NAME_E1H;
+       else if (!CHIP_IS_E1x(bp))
+               fw_file_name = FW_FILE_NAME_E2;
+       else {
+               BNX2X_ERR("Unsupported chip revision\n");
+               return -EINVAL;
+       }
+       BNX2X_DEV_INFO("Loading %s\n", fw_file_name);
 
-               rc = request_firmware(&bp->firmware, fw_file_name,
-                                     &bp->pdev->dev);
-               if (rc) {
-                       BNX2X_ERR("Can't load firmware file %s\n",
-                                 fw_file_name);
-                       goto request_firmware_exit;
-               }
+       rc = request_firmware(&bp->firmware, fw_file_name, &bp->pdev->dev);
+       if (rc) {
+               BNX2X_ERR("Can't load firmware file %s\n",
+                         fw_file_name);
+               goto request_firmware_exit;
+       }
 
-               rc = bnx2x_check_firmware(bp);
-               if (rc) {
-                       BNX2X_ERR("Corrupt firmware file %s\n", fw_file_name);
-                       goto request_firmware_exit;
-               }
+       rc = bnx2x_check_firmware(bp);
+       if (rc) {
+               BNX2X_ERR("Corrupt firmware file %s\n", fw_file_name);
+               goto request_firmware_exit;
        }
 
        fw_hdr = (struct bnx2x_fw_file_hdr *)bp->firmware->data;