mirror of
https://github.com/zeromq/libzmq.git
synced 2025-06-05 22:20:54 +02:00
Safety measure in zmq_msg_close implemented
zmq_msg_close now empties the message on zmq_msg_close, thus not leaving random data in the structure, that may be mistaken for a valid message. Signed-off-by: Martin Sustrik <sustrik@250bpm.com>
This commit is contained in:
parent
b174ad2c45
commit
cafcdbbe2b
32
src/zmq.cpp
32
src/zmq.cpp
@ -154,24 +154,30 @@ int zmq_msg_init_data (zmq_msg_t *msg_, void *data_, size_t size_,
|
|||||||
int zmq_msg_close (zmq_msg_t *msg_)
|
int zmq_msg_close (zmq_msg_t *msg_)
|
||||||
{
|
{
|
||||||
// For VSMs and delimiters there are no resources to free.
|
// For VSMs and delimiters there are no resources to free.
|
||||||
if (msg_->content == (zmq::msg_content_t*) ZMQ_DELIMITER ||
|
if (msg_->content != (zmq::msg_content_t*) ZMQ_DELIMITER &&
|
||||||
msg_->content == (zmq::msg_content_t*) ZMQ_VSM)
|
msg_->content != (zmq::msg_content_t*) ZMQ_VSM) {
|
||||||
return 0;
|
|
||||||
|
|
||||||
// If the content is not shared, or if it is shared and the reference.
|
// If the content is not shared, or if it is shared and the reference.
|
||||||
// count has dropped to zero, deallocate it.
|
// count has dropped to zero, deallocate it.
|
||||||
zmq::msg_content_t *content = (zmq::msg_content_t*) msg_->content;
|
zmq::msg_content_t *content = (zmq::msg_content_t*) msg_->content;
|
||||||
if (!(msg_->flags & ZMQ_MSG_SHARED) || !content->refcnt.sub (1)) {
|
if (!(msg_->flags & ZMQ_MSG_SHARED) || !content->refcnt.sub (1)) {
|
||||||
|
|
||||||
// We used "placement new" operator to initialize the reference.
|
// We used "placement new" operator to initialize the reference.
|
||||||
// counter so we call its destructor now.
|
// counter so we call its destructor now.
|
||||||
content->refcnt.~atomic_counter_t ();
|
content->refcnt.~atomic_counter_t ();
|
||||||
|
|
||||||
if (content->ffn)
|
if (content->ffn)
|
||||||
content->ffn (content->data, content->hint);
|
content->ffn (content->data, content->hint);
|
||||||
free (content);
|
free (content);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// As a safety measure, let's make the deallocated message look like
|
||||||
|
// an empty message.
|
||||||
|
msg_->content = (zmq::msg_content_t*) ZMQ_VSM;
|
||||||
|
msg_->flags = 0;
|
||||||
|
msg_->vsm_size = 0;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user