Commit 725f141f authored by Ivan Pechorin's avatar Ivan Pechorin

Fix LIBZMQ-211: REP socket asserting when getting malformed request

REP socket demands at least an empty address stack. The server asserted on (msg_->flags () & msg_t::more) in rep.cpp:75 when receiving a malformed request without empty part.

This patch makes a REP socket to discard and silently ignore such malformed requests.
parent 9b58372a
...@@ -72,13 +72,25 @@ int zmq::rep_t::xrecv (msg_t *msg_, int flags_) ...@@ -72,13 +72,25 @@ int zmq::rep_t::xrecv (msg_t *msg_, int flags_)
int rc = router_t::xrecv (msg_, flags_); int rc = router_t::xrecv (msg_, flags_);
if (rc != 0) if (rc != 0)
return rc; return rc;
zmq_assert (msg_->flags () & msg_t::more);
if ((msg_->flags () & msg_t::more)) {
// Empty message part delimits the traceback stack.
bool bottom = (msg_->size () == 0); bool bottom = (msg_->size () == 0);
// Push it to the reply pipe.
rc = router_t::xsend (msg_, flags_); rc = router_t::xsend (msg_, flags_);
errno_assert (rc == 0); errno_assert (rc == 0);
if (bottom) if (bottom)
break; break;
} }
else {
// If the traceback stack is malformed, discard anything
// already sent to pipe (we're at end of invalid message).
rc = router_t::rollback ();
errno_assert (rc == 0);
}
}
request_begins = false; request_begins = false;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment