hpsa: fix memory leak in hpsa_alloc_cmd_pool
authorRobert Elliott <elliott@hp.com>
Fri, 23 Jan 2015 22:42:48 +0000 (16:42 -0600)
committerJames Bottomley <JBottomley@Parallels.com>
Mon, 2 Feb 2015 17:57:39 +0000 (09:57 -0800)
Partial allocation failure wasn't handled correctly

Reviewed-by: Scott Teel <scott.teel@pmcs.com>
Signed-off-by: Robert Elliott <elliott@hp.com>
Signed-off-by: Don Brace <don.brace@pmcs.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/scsi/hpsa.c

index dc328ce..a66a50e 100644 (file)
@@ -211,6 +211,7 @@ static struct CommandList *cmd_special_alloc(struct ctlr_info *h);
 static int fill_cmd(struct CommandList *c, u8 cmd, struct ctlr_info *h,
        void *buff, size_t size, u16 page_code, unsigned char *scsi3addr,
        int cmd_type);
+static void hpsa_free_cmd_pool(struct ctlr_info *h);
 #define VPD_PAGE (1 << 8)
 
 static int hpsa_scsi_queue_command(struct Scsi_Host *h, struct scsi_cmnd *cmd);
@@ -6471,9 +6472,12 @@ static int hpsa_allocate_cmd_pool(struct ctlr_info *h)
            || (h->cmd_pool == NULL)
            || (h->errinfo_pool == NULL)) {
                dev_err(&h->pdev->dev, "out of memory in %s", __func__);
-               return -ENOMEM;
+               goto clean_up;
        }
        return 0;
+clean_up:
+       hpsa_free_cmd_pool(h);
+       return -ENOMEM;
 }
 
 static void hpsa_free_cmd_pool(struct ctlr_info *h)