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 (); | 
