summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Müller <marcus@hostalia.de>2017-06-24 23:30:42 +0200
committerMarcus Müller <marcus@hostalia.de>2017-06-24 23:30:42 +0200
commita16ed67b5dae099c6ac1447c000f15765b13422f (patch)
tree3e9047b87b9a64720745057a089b24a518f4b2d4
parentb57a37f7c676542f08a27d3f141f4d9ed2ab1132 (diff)
Fixed storing references to temporary values in RPC infrastructure
The RPC aggregator and friends were taking callback objects passed by value, and then internally called, again by value, constructors which initialized reference fields to these parameters. This has the effect of storing references to temporary objects. Chances are, no-one is using that code, or compiler UB saved our collective behinds. In any case, we might need to more carefully dissect the RPC code. There be dragons.
-rw-r--r--gnuradio-runtime/include/gnuradio/rpccallbackregister_base.h6
-rw-r--r--gnuradio-runtime/include/gnuradio/rpcserver_aggregator.h12
-rw-r--r--gnuradio-runtime/include/gnuradio/rpcserver_base.h6
-rw-r--r--gnuradio-runtime/lib/controlport/rpcserver_aggregator.cc6
4 files changed, 15 insertions, 15 deletions
diff --git a/gnuradio-runtime/include/gnuradio/rpccallbackregister_base.h b/gnuradio-runtime/include/gnuradio/rpccallbackregister_base.h
index 14e8772449..c136791994 100644
--- a/gnuradio-runtime/include/gnuradio/rpccallbackregister_base.h
+++ b/gnuradio-runtime/include/gnuradio/rpccallbackregister_base.h
@@ -104,11 +104,11 @@ struct callbackregister_base
callbackregister_base() {;}
virtual ~callbackregister_base() {;}
- virtual void registerConfigureCallback(const std::string &id, const configureCallback_t callback) = 0;
+ virtual void registerConfigureCallback(const std::string &id, const configureCallback_t &callback) = 0;
virtual void unregisterConfigureCallback(const std::string &id) = 0;
- virtual void registerQueryCallback(const std::string &id, const queryCallback_t callback) = 0;
+ virtual void registerQueryCallback(const std::string &id, const queryCallback_t &callback) = 0;
virtual void unregisterQueryCallback(const std::string &id) = 0;
- virtual void registerHandlerCallback(const std::string &id, const handlerCallback_t callback) = 0;
+ virtual void registerHandlerCallback(const std::string &id, const handlerCallback_t &callback) = 0;
virtual void unregisterHandlerCallback(const std::string &id) = 0;
};
diff --git a/gnuradio-runtime/include/gnuradio/rpcserver_aggregator.h b/gnuradio-runtime/include/gnuradio/rpcserver_aggregator.h
index 08426bb00c..c9c5356309 100644
--- a/gnuradio-runtime/include/gnuradio/rpcserver_aggregator.h
+++ b/gnuradio-runtime/include/gnuradio/rpcserver_aggregator.h
@@ -34,13 +34,13 @@ public:
rpcserver_aggregator();
virtual ~rpcserver_aggregator();
- void registerConfigureCallback(const std::string &id, const configureCallback_t callback);
+ void registerConfigureCallback(const std::string &id, const configureCallback_t &callback);
void unregisterConfigureCallback(const std::string &id);
- void registerQueryCallback(const std::string &id, const queryCallback_t callback);
+ void registerQueryCallback(const std::string &id, const queryCallback_t &callback);
void unregisterQueryCallback(const std::string &id);
- void registerHandlerCallback(const std::string &id, const handlerCallback_t callback);
+ void registerHandlerCallback(const std::string &id, const handlerCallback_t &callback);
void unregisterHandlerCallback(const std::string &id);
void registerServer(rpcmanager_base::rpcserver_booter_base_sptr server);
@@ -53,7 +53,7 @@ private:
template<class T, typename Tcallback>
struct registerConfigureCallback_f: public std::unary_function<T,void>
{
- registerConfigureCallback_f(const std::string &_id, const Tcallback _callback)
+ registerConfigureCallback_f(const std::string &_id, const Tcallback &_callback)
: id(_id), callback(_callback)
{;}
@@ -75,7 +75,7 @@ private:
template<class T, typename Tcallback>
struct registerQueryCallback_f: public std::unary_function<T,void>
{
- registerQueryCallback_f(const std::string &_id, const Tcallback _callback)
+ registerQueryCallback_f(const std::string &_id, const Tcallback &_callback)
: id(_id), callback(_callback)
{;}
@@ -99,7 +99,7 @@ private:
template<class T, typename Tcallback>
struct registerHandlerCallback_f: public std::unary_function<T,void>
{
- registerHandlerCallback_f(const std::string &_id, const Tcallback _callback)
+ registerHandlerCallback_f(const std::string &_id, const Tcallback &_callback)
: id(_id), callback(_callback)
{;}
diff --git a/gnuradio-runtime/include/gnuradio/rpcserver_base.h b/gnuradio-runtime/include/gnuradio/rpcserver_base.h
index 276dec5d1e..c85165bcad 100644
--- a/gnuradio-runtime/include/gnuradio/rpcserver_base.h
+++ b/gnuradio-runtime/include/gnuradio/rpcserver_base.h
@@ -31,13 +31,13 @@ public:
rpcserver_base() : cur_priv(RPC_PRIVLVL_ALL) {;}
virtual ~rpcserver_base() {;}
- virtual void registerConfigureCallback(const std::string &id, const configureCallback_t callback) = 0;
+ virtual void registerConfigureCallback(const std::string &id, const configureCallback_t &callback) = 0;
virtual void unregisterConfigureCallback(const std::string &id) = 0;
- virtual void registerQueryCallback(const std::string &id, const queryCallback_t callback) = 0;
+ virtual void registerQueryCallback(const std::string &id, const queryCallback_t &callback) = 0;
virtual void unregisterQueryCallback(const std::string &id) = 0;
- virtual void registerHandlerCallback(const std::string &id, const handlerCallback_t callback) = 0;
+ virtual void registerHandlerCallback(const std::string &id, const handlerCallback_t &callback) = 0;
virtual void unregisterHandlerCallback(const std::string &id) = 0;
virtual void setCurPrivLevel(const priv_lvl_t priv) { cur_priv = priv; }
diff --git a/gnuradio-runtime/lib/controlport/rpcserver_aggregator.cc b/gnuradio-runtime/lib/controlport/rpcserver_aggregator.cc
index e81a899626..f546c2daab 100644
--- a/gnuradio-runtime/lib/controlport/rpcserver_aggregator.cc
+++ b/gnuradio-runtime/lib/controlport/rpcserver_aggregator.cc
@@ -47,7 +47,7 @@ rpcserver_aggregator::registeredServers()
void
rpcserver_aggregator::registerConfigureCallback(const std::string &id,
- const configureCallback_t callback)
+ const configureCallback_t &callback)
{
std::for_each(d_serverlist.begin(), d_serverlist.end(),
registerConfigureCallback_f<rpcmanager_base::rpcserver_booter_base_sptr, configureCallback_t>(id, callback));
@@ -61,7 +61,7 @@ rpcserver_aggregator::unregisterConfigureCallback(const std::string &id)
}
void
-rpcserver_aggregator::registerQueryCallback(const std::string &id, const queryCallback_t callback)
+rpcserver_aggregator::registerQueryCallback(const std::string &id, const queryCallback_t &callback)
{
std::for_each(d_serverlist.begin(), d_serverlist.end(),
registerQueryCallback_f<rpcmanager_base::rpcserver_booter_base_sptr, queryCallback_t>(id, callback));
@@ -78,7 +78,7 @@ rpcserver_aggregator::unregisterQueryCallback(const std::string &id)
void
rpcserver_aggregator::registerHandlerCallback(const std::string &id,
- const handlerCallback_t callback)
+ const handlerCallback_t &callback)
{
std::for_each(d_serverlist.begin(), d_serverlist.end(),
registerHandlerCallback_f<rpcmanager_base::rpcserver_booter_base_sptr, handlerCallback_t>(id, callback));