pv: fix memory leak when getting $conid
authorCamille Oudot <camille.oudot@orange.com>
Mon, 13 Apr 2015 15:04:41 +0000 (17:04 +0200)
committerCamille Oudot <camille.oudot@orange.com>
Mon, 13 Apr 2015 15:23:04 +0000 (17:23 +0200)
modules/pv/pv_core.c
tcp_main.c

index dececb6..a4eab9a 100644 (file)
@@ -1874,6 +1874,7 @@ int pv_get_tcpconn_id(struct sip_msg *msg, pv_param_t *param,
                pv_value_t *res)
 {
        struct tcp_connection *con;
+       int conid;
 
        if (msg == NULL)
                return -1;
@@ -1881,7 +1882,10 @@ int pv_get_tcpconn_id(struct sip_msg *msg, pv_param_t *param,
        if ((con = tcpconn_get(msg->rcv.proto_reserved1, 0, 0, 0, 0)) == NULL)
                return pv_get_null(msg, param, res);
 
-       return pv_get_sintval(msg, param, res, con->id);
+       conid = con->id;
+       tcpconn_put(con);
+
+       return pv_get_sintval(msg, param, res, conid);
 }
 
 
index 5553921..df778ba 100644 (file)
@@ -1411,6 +1411,8 @@ struct tcp_connection* _tcpconn_find(int id, struct ip_addr* ip, int port,
 /* _tcpconn_find with locks and timeout
  * local_addr contains the desired local ip:port. If null any local address 
  * will be used.  IN*ADDR_ANY or 0 port are wild cards.
+ * If found, the connection's reference counter will be incremented, you might
+ * want to decrement it after use.
  */
 struct tcp_connection* tcpconn_get(int id, struct ip_addr* ip, int port,
                                                                        union sockaddr_union* local_addr,