diff options
author | Harald Welte <laforge@gnumonks.org> | 2017-04-08 22:17:19 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2017-04-10 06:52:59 +0000 |
commit | 7cee4b67e90aeb260bde11ee7f299e507c94bc10 (patch) | |
tree | 8a2b91a982de8c727116e406b2c1b2866c1c2c4e /src/datagram.c | |
parent | 0bacc71fc208e5cdf0727de027438b8e901ff666 (diff) |
stream/datagram: Ensure reliable close/destroy
* when using osmo_*_destroy(), always call *_close() internally to
make sure we don't free memory holding references to sockets that are
still open
* when closing the socket, always make sure to set the fd to -1 in all
cases, to avoid attempts to avoid later close() on a new file using
the same fd number as the socket closed previously.
Change-Id: I29c37da6e8f5be8ab030e68952a8f92add146821
Diffstat (limited to 'src/datagram.c')
-rw-r--r-- | src/datagram.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/datagram.c b/src/datagram.c index 13f1b5c..d98221f 100644 --- a/src/datagram.c +++ b/src/datagram.c @@ -54,8 +54,11 @@ struct osmo_dgram_tx { * abstraction and close the socket */ void osmo_dgram_tx_close(struct osmo_dgram_tx *conn) { + if (conn->ofd.fd == -1) + return; osmo_fd_unregister(&conn->ofd); close(conn->ofd.fd); + conn->ofd.fd = -1; } static int osmo_dgram_tx_write(struct osmo_dgram_tx *conn) @@ -173,6 +176,7 @@ osmo_dgram_tx_set_data(struct osmo_dgram_tx *conn, void *data) * \param[in] conn Datagram Transmitter to destroy */ void osmo_dgram_tx_destroy(struct osmo_dgram_tx *conn) { + osmo_dgram_tx_close(conn); talloc_free(conn); } @@ -198,6 +202,7 @@ int osmo_dgram_tx_open(struct osmo_dgram_tx *conn) conn->ofd.fd = ret; if (osmo_fd_register(&conn->ofd) < 0) { close(ret); + conn->ofd.fd = -1; return -EIO; } return 0; @@ -317,10 +322,10 @@ void osmo_dgram_rx_set_read_cb(struct osmo_dgram_rx *conn, } /*! \brief Destroy the datagram receiver. Releases Memory. - * Caller must make sure to osmo_dgram_rx_close() before calling * \param[in] conn Datagram Receiver */ void osmo_dgram_rx_destroy(struct osmo_dgram_rx *conn) { + osmo_dgram_rx_close(conn); talloc_free(conn); } @@ -345,6 +350,7 @@ int osmo_dgram_rx_open(struct osmo_dgram_rx *conn) conn->ofd.fd = ret; if (osmo_fd_register(&conn->ofd) < 0) { close(ret); + conn->ofd.fd = -1; return -EIO; } return 0; @@ -356,8 +362,11 @@ int osmo_dgram_rx_open(struct osmo_dgram_rx *conn) * \param[in] conn Stream Server Link to close */ void osmo_dgram_rx_close(struct osmo_dgram_rx *conn) { + if (conn->ofd.fd == -1) + return; osmo_fd_unregister(&conn->ofd); close(conn->ofd.fd); + conn->ofd.fd = -1; } /* |