This diff fixes a memory leak in ofp_read() that happens in every message
and a infinite loop that happens when the remote switch closes the
connection.

ok?

Index: ofp.c
===================================================================
RCS file: /home/obsdcvs/src/usr.sbin/switchd/ofp.c,v
retrieving revision 1.7
diff -u -p -r1.7 ofp.c
--- ofp.c       14 Sep 2016 13:46:51 -0000      1.7
+++ ofp.c       21 Sep 2016 11:59:46 -0000
@@ -146,6 +146,7 @@ void
 ofp_close(struct switch_connection *con)
 {
        log_info("%s: connection %u closed", __func__, con->con_id);
+       event_del(&con->con_ev);
        switch_remove(con->con_sc, con->con_switch);
        close(con->con_fd);
        TAILQ_REMOVE(&conn_head, con, con_next);
@@ -203,7 +204,7 @@ ofp_read(int fd, short event, void *arg)
        if ((len = read(fd, buf, sizeof(buf))) == -1)
                goto fail;
        if (len == 0)
-               return;
+               goto fail;
 
        if ((ibuf = ibuf_new(buf, len)) == NULL)
                goto fail;
@@ -236,6 +237,7 @@ ofp_read(int fd, short event, void *arg)
                goto fail;
        }
 
+       ibuf_release(ibuf);
        return;
 
  fail:

Reply via email to