summaryrefslogtreecommitdiff
path: root/gr-network/lib/udp_source_impl.cc
diff options
context:
space:
mode:
authorClayton Smith <argilo@gmail.com>2021-12-07 08:16:46 -0500
committermormj <34754695+mormj@users.noreply.github.com>2021-12-07 09:20:21 -0500
commit35a242f1cd4b724be0c4708d8690f82c804aafd8 (patch)
treef426244a52dbacab59518698e0df3f1f3f166a9d /gr-network/lib/udp_source_impl.cc
parentbbd98d195dc1f300fb4fc34ed94941da2854dd9e (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.cc24
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;
}
/*