Re: switchd(8): fix memory leak and loop

2016-09-23 Thread Reyk Floeter
On Thu, Sep 22, 2016 at 09:46:50PM +0200, Rafael Zalamena wrote:
> 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?
> 

I'm planning to replace this part of the code (network I/O).

but OK reyk@

> 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 -  1.7
> +++ ofp.c 21 Sep 2016 11:59:46 -
> @@ -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:

-- 



switchd(8): fix memory leak and loop

2016-09-23 Thread Rafael Zalamena
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 -  1.7
+++ ofp.c   21 Sep 2016 11:59:46 -
@@ -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: