int zmq::mechanism_t::parse_metadata (const unsigned char *ptr_, size_t length_, bool zap_flag) { size_t bytes_left = length_; while (bytes_left > 1) { const size_t name_length = static_cast <size_t> (*ptr_); ptr_ += 1; bytes_left -= 1; if (bytes_left < name_length) break; const std::string name = std::string ((char *) ptr_, name_length); ptr_ += name_length; bytes_left -= name_length; if (bytes_left < 4) break; const size_t value_length = static_cast <size_t> (get_uint32 (ptr_)); ptr_ += 4; bytes_left -= 4; if (bytes_left < value_length) break; const uint8_t *value = ptr_; ptr_ += value_length; bytes_left -= value_length; if (name == "Identity" && options.recv_identity) set_peer_identity (value, value_length); else if (name == "Socket-Type") { const std::string socket_type ((char *) value, value_length); if (!check_socket_type (socket_type)) { errno = EINVAL; return -1; } } else { const int rc = property (name, value, value_length); if (rc == -1) return -1; } if (zap_flag) zap_properties.insert ( metadata_t::dict_t::value_type ( name, std::string ((char *) value, value_length))); else zmtp_properties.insert ( metadata_t::dict_t::value_type ( name, std::string ((char *) value, value_length))); } if (bytes_left > 0) { errno = EPROTO; return -1; } return 0; }
int zmq::mechanism_t::parse_metadata (const unsigned char *ptr_, size_t length_, bool zap_flag) { size_t bytes_left = length_; while (bytes_left > 1) { const size_t name_length = static_cast <size_t> (*ptr_); ptr_ += 1; bytes_left -= 1; if (bytes_left < name_length) break; const std::string name = std::string ((char *) ptr_, name_length); ptr_ += name_length; bytes_left -= name_length; if (bytes_left < 4) break; const size_t value_length = static_cast <size_t> (get_uint32 (ptr_)); ptr_ += 4; bytes_left -= 4; if (bytes_left < value_length) break; const uint8_t *value = ptr_; ptr_ += value_length; bytes_left -= value_length; if (name == ZMTP_PROPERTY_IDENTITY && options.recv_routing_id) set_peer_routing_id (value, value_length); else if (name == ZMTP_PROPERTY_SOCKET_TYPE) { const std::string socket_type ((char *) value, value_length); if (!check_socket_type (socket_type)) { errno = EINVAL; return -1; } } else { const int rc = property (name, value, value_length); if (rc == -1) return -1; } if (zap_flag) zap_properties.ZMQ_MAP_INSERT_OR_EMPLACE ( name, std::string ((char *) value, value_length)); else zmtp_properties.ZMQ_MAP_INSERT_OR_EMPLACE ( name, std::string ((char *) value, value_length)); } if (bytes_left > 0) { errno = EPROTO; return -1; } return 0; }