[zeromq-dev] issue : libzmq can send messages in a curve socket before the handcheck is finished !
Laurent Alebarde
l.alebarde at free.fr
Sat Oct 19 12:28:37 CEST 2013
Hi Devs,
_Observation_ : libzmq can send messages in a curve socket before the
handcheck is finished
_Problem_ : This is anunexpected behaviour that can break some user's
program logic, or impose to add more logic to deal with. Moreover, it
happens in some rare and so not reproduceable circumstances, I assume in
multithread applications.
_Test program_ : test_concurrency_curve.cpp
<http://pastebin.com/0LzJKUyC> based on test_proxy.cpp (not yet merged -
pulling request waiting). The number of clients and workers can be
parametered and are set here to 1, to facilitate debugging. The keys
used are the ones in the documentation, while in normal set-up, this
test uses different keys for each client (this is in comments).
_To reproduce the problem_ :
Add this test in your repository in the subdirectory tests and add the
following lines at the appropriate place inside tests/Makefile.am to
take it into account :
test_concurrency_curve \
test_concurrency_curve_SOURCES = test_concurrency_curve.cpp
Set breakpoints here :
* test_concurrency_curve.cpp
o main, line 279 : msleep (1000);
o client_task, line 121 : rc = zmq_send (client, content,
CONTENT_SIZE, 0);
* curve_client.cpp
o zmq::curve_client_t::curve_client_t, line 41 : memcpy
(public_key, options_.curve_public_key, crypto_box_PUBLICKEYBYTES);
* curve_server.cpp
o zmq::curve_server_t::curve_server_t, line 47 : memcpy
(secret_key, options_.curve_secret_key, crypto_box_SECRETKEYBYTES);
The break points in curve_client.cpp and curve_server.cpp prevent the
handcheck to be performed.
The break point in test_concurrency_curve.cpp / client_task is where the
send is performed while the handcheck is not.
I can follow the send until zmq.cpp / s_sendmsg , then ypipe.hpp /
zmq::pipe_t::write. As the return value is 0, I assume the message has
been sent. Then s_sendmsg returns 13, which correspond to the message
size actually sent. Finally, the assert in
test_concurrency_curve.cpp line 122 is ok._
_
_Expected behaviour_ :
Two possibilities :
1. The send may be blocking until the handcheck is finished
successfully, possibly with a time-out.
2. The send is aborted with an error status, and the user application
SHALL check the connected status of the socket before using it.
I remain at your disposal for further information.
Cheers,
Laurent.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20131019/92debee9/attachment.htm>
More information about the zeromq-dev
mailing list