diff options
author | Clayton Smith <argilo@gmail.com> | 2021-12-07 08:16:46 -0500 |
---|---|---|
committer | mormj <34754695+mormj@users.noreply.github.com> | 2021-12-07 09:20:21 -0500 |
commit | 35a242f1cd4b724be0c4708d8690f82c804aafd8 (patch) | |
tree | f426244a52dbacab59518698e0df3f1f3f166a9d /gr-network/lib/udp_source_impl.cc | |
parent | bbd98d195dc1f300fb4fc34ed94941da2854dd9e (diff) |
network: fix segfaults when TCP & UDP blocks are restarted
The TCP and UDP blocks segfault if start() is called after stop(),
because stop() frees resources that are not re-allocated by start(). To
fix this, I've moved resource allocation for these blocks from the
constructor to start().
Signed-off-by: Clayton Smith <argilo@gmail.com>
Diffstat (limited to 'gr-network/lib/udp_source_impl.cc')
-rw-r--r-- | gr-network/lib/udp_source_impl.cc | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/gr-network/lib/udp_source_impl.cc b/gr-network/lib/udp_source_impl.cc index a05f6c103f..259506703c 100644 --- a/gr-network/lib/udp_source_impl.cc +++ b/gr-network/lib/udp_source_impl.cc @@ -103,6 +103,16 @@ udp_source_impl::udp_source_impl(size_t itemsize, d_precomp_data_size = d_payloadsize - d_header_size; d_precomp_data_over_item_size = d_precomp_data_size / d_itemsize; + int out_multiple = (d_payloadsize - d_header_size) / d_block_size; + + if (out_multiple == 1) + out_multiple = 2; // Ensure we get pairs, for instance complex -> ichar pairs + + gr::block::set_output_multiple(out_multiple); +} + +bool udp_source_impl::start() +{ d_local_buffer = new char[d_payloadsize]; long max_circ_buffer; @@ -119,9 +129,9 @@ udp_source_impl::udp_source_impl(size_t itemsize, d_localqueue = new boost::circular_buffer<char>(max_circ_buffer); if (is_ipv6) - d_endpoint = boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v6(), port); + d_endpoint = boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v6(), d_port); else - d_endpoint = boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), port); + d_endpoint = boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), d_port); try { d_udpsocket = new boost::asio::ip::udp::socket(d_io_service, d_endpoint); @@ -130,16 +140,12 @@ udp_source_impl::udp_source_impl(size_t itemsize, ex.what()); } - int out_multiple = (d_payloadsize - d_header_size) / d_block_size; - - if (out_multiple == 1) - out_multiple = 2; // Ensure we get pairs, for instance complex -> ichar pairs - - gr::block::set_output_multiple(out_multiple); std::stringstream msg_stream; - msg_stream << "Listening for data on UDP port " << port << "."; + msg_stream << "Listening for data on UDP port " << d_port << "."; GR_LOG_INFO(d_logger, msg_stream.str()); + + return true; } /* |