diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/router.cpp | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/src/router.cpp b/src/router.cpp index 3428c87..9f0dbc6 100755 --- a/src/router.cpp +++ b/src/router.cpp @@ -137,24 +137,29 @@ int zmq::router_t::xsend (msg_t *msg_, int flags_) more_out = true; // Find the pipe associated with the peer ID stored in the prefix. - // If there's no such pipe just silently ignore the message. - zmq_assert (msg_->size () == 4); + if (unlikely (msg_->size () != 4)) { + errno = ECANTROUTE; + return -1; + } uint32_t peer_id = get_uint32 ((unsigned char*) msg_->data ()); outpipes_t::iterator it = outpipes.find (peer_id); + if (unlikely (it == outpipes.end ())) { + errno = ECANTROUTE; + return -1; + } - if (it != outpipes.end ()) { - current_out = it->second.pipe; - msg_t empty; - int rc = empty.init (); - errno_assert (rc == 0); - if (!current_out->check_write (&empty)) { - it->second.active = false; - more_out = false; - current_out = NULL; - } - rc = empty.close (); - errno_assert (rc == 0); + // Check whether the pipe is available for writing. + current_out = it->second.pipe; + msg_t empty; + int rc = empty.init (); + errno_assert (rc == 0); + if (!current_out->check_write (&empty)) { + it->second.active = false; + more_out = false; + current_out = NULL; } + rc = empty.close (); + errno_assert (rc == 0); } int rc = msg_->close (); |