diff --git a/src/msg.cpp b/src/msg.cpp index 2fc2274f..f83ca056 100644 --- a/src/msg.cpp +++ b/src/msg.cpp @@ -58,7 +58,7 @@ int zmq::msg_t::init_size (size_t size_) u.lmsg.flags = 0; u.lmsg.content = (content_t*) malloc (sizeof (content_t) + size_); - if (!u.lmsg.content) { + if (unlikely (!u.lmsg.content)) { errno = ENOMEM; return -1; } @@ -75,7 +75,11 @@ int zmq::msg_t::init_size (size_t size_) int zmq::msg_t::init_data (void *data_, size_t size_, msg_free_fn *ffn_, void *hint_) { - // Initialize constant message if there's no need to deallocate + // If data is NULL and size is not 0, a segfault + // would occur once the data is accessed + assert (data_ != NULL || size_ == 0); + + // Initialize constant message if there's no need to deallocate if(ffn_ == NULL) { u.cmsg.type = type_cmsg; u.cmsg.flags = 0; diff --git a/src/msg.hpp b/src/msg.hpp index bc0a9376..bac1f09a 100644 --- a/src/msg.hpp +++ b/src/msg.hpp @@ -44,7 +44,7 @@ namespace zmq { public: - // Mesage flags. + // Message flags. enum { more = 1, @@ -105,10 +105,13 @@ namespace zmq enum type_t { type_min = 101, + // VSM messages store the content in the message itself type_vsm = 101, + // LMSG messages store the content in malloc-ed memory type_lmsg = 102, + // Delimiter messages are used in envelopes type_delimiter = 103, - // CMSG messages point to constant data + // CMSG messages point to constant data type_cmsg = 104, type_max = 104 }; diff --git a/src/zmq.cpp b/src/zmq.cpp index def0ba91..ff3e60fa 100644 --- a/src/zmq.cpp +++ b/src/zmq.cpp @@ -539,7 +539,7 @@ int zmq_recviov (void *s_, iovec *a_, size_t *count_, int flags_) a_[i].iov_len = zmq_msg_size (&msg); a_[i].iov_base = malloc(a_[i].iov_len); - if (!a_[i].iov_base) { + if (unlikely (!a_[i].iov_base)) { errno = ENOMEM; return -1; }