caif: Fixed potential memory leak
authorKim Lilliestierna XX <kim.xx.lilliestierna@stericsson.com>
Mon, 25 Jun 2012 07:49:35 +0000 (07:49 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 25 Jun 2012 23:44:11 +0000 (16:44 -0700)
Rearranged the allocation and packet creations to
avoid potential leaks in error path.

Signed-off-by: Kim Lilliestierna <kim.xx.lilliestierna@stericsson.com>
Signed-off-by: Sjur Brændeland <sjur.brandeland@stericssion.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/caif/cfctrl.c

index 047cd0e..44f270f 100644 (file)
@@ -175,15 +175,17 @@ static void init_info(struct caif_payload_info *info, struct cfctrl *cfctrl)
 
 void cfctrl_enum_req(struct cflayer *layer, u8 physlinkid)
 {
+       struct cfpkt *pkt;
        struct cfctrl *cfctrl = container_obj(layer);
-       struct cfpkt *pkt = cfpkt_create(CFPKT_CTRL_PKT_LEN);
        struct cflayer *dn = cfctrl->serv.layer.dn;
-       if (!pkt)
-               return;
+
        if (!dn) {
                pr_debug("not able to send enum request\n");
                return;
        }
+       pkt = cfpkt_create(CFPKT_CTRL_PKT_LEN);
+       if (!pkt)
+               return;
        caif_assert(offsetof(struct cfctrl, serv.layer) == 0);
        init_info(cfpkt_info(pkt), cfctrl);
        cfpkt_info(pkt)->dev_info->id = physlinkid;
@@ -302,18 +304,17 @@ int cfctrl_linkdown_req(struct cflayer *layer, u8 channelid,
                                struct cflayer *client)
 {
        int ret;
+       struct cfpkt *pkt;
        struct cfctrl *cfctrl = container_obj(layer);
-       struct cfpkt *pkt = cfpkt_create(CFPKT_CTRL_PKT_LEN);
        struct cflayer *dn = cfctrl->serv.layer.dn;
 
-       if (!pkt)
-               return -ENOMEM;
-
        if (!dn) {
                pr_debug("not able to send link-down request\n");
                return -ENODEV;
        }
-
+       pkt = cfpkt_create(CFPKT_CTRL_PKT_LEN);
+       if (!pkt)
+               return -ENOMEM;
        cfpkt_addbdy(pkt, CFCTRL_CMD_LINK_DESTROY);
        cfpkt_addbdy(pkt, channelid);
        init_info(cfpkt_info(pkt), cfctrl);