Addressing "this function needs a cleanup block, lots of free(blah); return (0)"
comment for vioblk_notifyq() and doing the same for vionet_enq_rx(). 

Index: virtio.c
===================================================================
RCS file: /home/nayden/cvsync/src/usr.sbin/vmd/virtio.c,v
retrieving revision 1.17
diff -u -p -r1.17 virtio.c
--- virtio.c    17 Aug 2016 05:07:13 -0000      1.17
+++ virtio.c    31 Aug 2016 10:35:55 -0000
@@ -353,8 +353,7 @@ vioblk_do_write(struct vioblk_dev *dev, 
 }
 
 /*
- * XXX this function needs a cleanup block, lots of free(blah); return (0)
- *     in various cases, ds should be set to VIRTIO_BLK_S_IOERR, if we can
+ * XXX in various cases, ds should be set to VIRTIO_BLK_S_IOERR, if we can
  * XXX cant trust ring data from VM, be extra cautious.
  */
 int
@@ -390,8 +389,7 @@ vioblk_notifyq(struct vioblk_dev *dev)
 
        if (read_mem(q_gpa, vr, vr_sz)) {
                log_warnx("error reading gpa 0x%llx", q_gpa);
-               free(vr);
-               return (0);
+               goto out;
        }
 
        /* Compute offsets in ring of descriptors, avail ring, and used ring */
@@ -406,8 +404,7 @@ vioblk_notifyq(struct vioblk_dev *dev)
 
        if ((avail->idx & VIOBLK_QUEUE_MASK) == idx) {
                log_warnx("vioblk queue notify - nothing to do?");
-               free(vr);
-               return (0);
+               goto out;
        }
 
        cmd_desc_idx = avail->ring[idx] & VIOBLK_QUEUE_MASK;
@@ -416,16 +413,14 @@ vioblk_notifyq(struct vioblk_dev *dev)
        if ((cmd_desc->flags & VRING_DESC_F_NEXT) == 0) {
                log_warnx("unchained vioblk cmd descriptor received "
                    "(idx %d)", cmd_desc_idx);
-               free(vr);
-               return (0);
+               goto out;
        }
 
        /* Read command from descriptor ring */
        if (read_mem(cmd_desc->addr, &cmd, cmd_desc->len)) {
                log_warnx("vioblk: command read_mem error @ 0x%llx",
                    cmd_desc->addr);
-               free(vr);
-               return (0);
+               goto out;
        }
 
        switch (cmd.type) {
@@ -437,8 +432,7 @@ vioblk_notifyq(struct vioblk_dev *dev)
                if ((secdata_desc->flags & VRING_DESC_F_NEXT) == 0) {
                        log_warnx("unchained vioblk data descriptor "
                            "received (idx %d)", cmd_desc_idx);
-                       free(vr);
-                       return (0);
+                       goto out;
                }
 
                secbias = 0;
@@ -453,8 +447,7 @@ vioblk_notifyq(struct vioblk_dev *dev)
                        if (secdata == NULL) {
                                log_warnx("vioblk: block read error, "
                                    "sector %lld", cmd.sector);
-                               free(vr);
-                               return (0);
+                               goto out;
                        }
 
                        if (write_mem(secdata_desc->addr, secdata,
@@ -463,9 +456,8 @@ vioblk_notifyq(struct vioblk_dev *dev)
                                    "data to gpa @ 0x%llx",
                                    secdata_desc->addr);
                                dump_descriptor_chain(desc, cmd_desc_idx);
-                               free(vr);
                                free(secdata);
-                               return (0);
+                               goto out;
                        }
 
                        free(secdata);
@@ -484,8 +476,7 @@ vioblk_notifyq(struct vioblk_dev *dev)
                        log_warnx("can't write device status data @ "
                            "0x%llx", ds_desc->addr);
                        dump_descriptor_chain(desc, cmd_desc_idx);
-                       free(vr);
-                       return (0);
+                       goto out;
                }
 
 
@@ -509,16 +500,14 @@ vioblk_notifyq(struct vioblk_dev *dev)
                if ((secdata_desc->flags & VRING_DESC_F_NEXT) == 0) {
                        log_warnx("wr vioblk: unchained vioblk data "
                            "descriptor received (idx %d)", cmd_desc_idx);
-                       free(vr);
-                       return (0);
+                       goto out;
                }
 
                secdata = malloc(MAXPHYS);
                if (secdata == NULL) {
                        log_warn("wr vioblk: malloc error, len %d",
                            secdata_desc->len);
-                       free(vr);
-                       return (0);
+                       goto out;
                }
 
                secbias = 0;
@@ -529,17 +518,15 @@ vioblk_notifyq(struct vioblk_dev *dev)
                                    "sector data @ 0x%llx",
                                    secdata_desc->addr);
                                dump_descriptor_chain(desc, cmd_desc_idx);
-                               free(vr);
                                free(secdata);
-                               return (0);
+                               goto out;
                        }
 
                        if (vioblk_do_write(dev, cmd.sector + secbias,
                            secdata, (ssize_t)secdata_desc->len)) {
                                log_warnx("wr vioblk: disk write error");
-                               free(vr);
                                free(secdata);
-                               return (0);
+                               goto out;
                        }
 
                        secbias += secdata_desc->len / VIRTIO_BLK_SECTOR_SIZE;
@@ -559,8 +546,7 @@ vioblk_notifyq(struct vioblk_dev *dev)
                        log_warnx("wr vioblk: can't write device status "
                            "data @ 0x%llx", ds_desc->addr);
                        dump_descriptor_chain(desc, cmd_desc_idx);
-                       free(vr);
-                       return (0);
+                       goto out;
                }
 
                ret = 1;
@@ -584,8 +570,7 @@ vioblk_notifyq(struct vioblk_dev *dev)
                        log_warnx("fl vioblk: can't write device status "
                            "data @ 0x%llx", ds_desc->addr);
                        dump_descriptor_chain(desc, cmd_desc_idx);
-                       free(vr);
-                       return (0);
+                       goto out;
                }
 
                ret = 1;
@@ -601,9 +586,8 @@ vioblk_notifyq(struct vioblk_dev *dev)
                }
                break;
        }
-
+out:
        free(vr);
-
        return (ret);
 }
 
@@ -810,8 +794,7 @@ vionet_enq_rx(struct vionet_dev *dev, ch
 
        if (read_mem(q_gpa, vr, vr_sz)) {
                log_warnx("rx enq: error reading gpa 0x%llx", q_gpa);
-               free(vr);
-               return (0);
+               goto out;
        }
 
        /* Compute offsets in ring of descriptors, avail ring, and used ring */
@@ -825,8 +808,7 @@ vionet_enq_rx(struct vionet_dev *dev, ch
 
        if ((dev->vq[0].notified_avail & VIONET_QUEUE_MASK) == idx) {
                log_warnx("vionet queue notify - no space, dropping packet");
-               free(vr);
-               return (0);
+               goto out;
        }
 
        hdr_desc_idx = avail->ring[idx] & VIONET_QUEUE_MASK;
@@ -839,16 +821,14 @@ vionet_enq_rx(struct vionet_dev *dev, ch
        if ((pkt_desc->flags & VRING_DESC_F_WRITE) == 0) {
                log_warnx("unexpected readable rx descriptor %d",
                    pkt_desc_idx);
-               free(vr);
-               return (0);
+               goto out;
        }
 
        /* Write packet to descriptor ring */
        if (write_mem(pkt_desc->addr, pkt, sz)) {
                log_warnx("vionet: rx enq packet write_mem error @ "
                    "0x%llx", pkt_desc->addr);
-               free(vr);
-               return (0);
+               goto out;
        }
 
        ret = 1;
@@ -868,9 +848,8 @@ vionet_enq_rx(struct vionet_dev *dev, ch
                if (write_mem(q_gpa + off, &used->idx, sizeof used->idx))
                        log_warnx("vionet: error writing vio ring");
        }
-
+out:
        free(vr);
-
        return (ret);
 }
 

Reply via email to