//! used to send information to a newborn mthread
struct DNSComboWriter {
- DNSComboWriter(const char* data, uint16_t len, const struct timeval& now): d_mdp(true, data, len), d_now(now)
- {}
+ DNSComboWriter(const std::string& query, const struct timeval& now): d_mdp(true, query.c_str(), query.size()), d_now(now)
+ {
+ }
DNSComboWriter(const std::string& query, const struct timeval& now, std::vector<std::string>&& policyTags, LuaContext::LuaObject&& data): d_mdp(true, query.c_str(), query.size()), d_now(now), d_policyTags(std::move(policyTags)), d_data(std::move(data))
{
g_log<<Logger::Error<<"Writing pid for "<<Utility::getpid()<<" to "<<s_pidfname<<" failed: "<<strerror(errno)<<endl;
}
-TCPConnection::TCPConnection(int fd, const ComboAddress& addr) : d_remote(addr), d_fd(fd)
+TCPConnection::TCPConnection(int fd, const ComboAddress& addr) : data(2, 0), d_remote(addr), d_fd(fd)
{
++s_currentConnections;
(*t_tcpClientCounts)[d_remote]++;
shared_ptr<TCPConnection> conn=any_cast<shared_ptr<TCPConnection> >(var);
if(conn->state==TCPConnection::BYTE0) {
- ssize_t bytes=recv(conn->getFD(), conn->data, 2, 0);
+ ssize_t bytes=recv(conn->getFD(), &conn->data[0], 2, 0);
if(bytes==1)
conn->state=TCPConnection::BYTE1;
if(bytes==2) {
conn->qlen=(((unsigned char)conn->data[0]) << 8)+ (unsigned char)conn->data[1];
+ conn->data.resize(conn->qlen);
conn->bytesread=0;
conn->state=TCPConnection::GETQUESTION;
}
}
}
else if(conn->state==TCPConnection::BYTE1) {
- ssize_t bytes=recv(conn->getFD(), conn->data+1, 1, 0);
+ ssize_t bytes=recv(conn->getFD(), &conn->data[1], 1, 0);
if(bytes==1) {
conn->state=TCPConnection::GETQUESTION;
conn->qlen=(((unsigned char)conn->data[0]) << 8)+ (unsigned char)conn->data[1];
+ conn->data.resize(conn->qlen);
conn->bytesread=0;
}
if(!bytes || bytes < 0) {
}
}
else if(conn->state==TCPConnection::GETQUESTION) {
- ssize_t bytes=recv(conn->getFD(), conn->data + conn->bytesread, conn->qlen - conn->bytesread, 0);
+ ssize_t bytes=recv(conn->getFD(), &conn->data[conn->bytesread], conn->qlen - conn->bytesread, 0);
if(!bytes || bytes < 0 || bytes > std::numeric_limits<std::uint16_t>::max()) {
g_log<<Logger::Error<<"TCP client "<< conn->d_remote.toStringWithPort() <<" disconnected while reading question body"<<endl;
t_fdm->removeReadFD(fd);
DNSComboWriter* dc=nullptr;
try {
- dc=new DNSComboWriter(conn->data, conn->qlen, g_now);
+ dc=new DNSComboWriter(conn->data, g_now);
}
catch(MOADNSException &mde) {
g_stats.clientParseError++;
bool xpfFound = false;
dc->d_ecsParsed = true;
dc->d_ecsFound = false;
- getQNameAndSubnet(std::string(conn->data, conn->qlen), &qname, &qtype, &qclass,
+ getQNameAndSubnet(conn->data, &qname, &qtype, &qclass,
dc->d_ecsFound, &dc->d_ednssubnet, g_gettagNeedsEDNSOptions ? &ednsOptions : nullptr,
xpfFound, needXPF ? &dc->d_source : nullptr, needXPF ? &dc->d_destination : nullptr);
if(t_protobufServer) {
try {
- const struct dnsheader* dh = (const struct dnsheader*) conn->data;
+ const struct dnsheader* dh = reinterpret_cast<const struct dnsheader*>(&conn->data[0]);
if (logQuery && !(luaconfsLocal->protobufExportConfig.taggedOnly && dc->d_policyTags.empty())) {
protobufLogQuery(t_protobufServer, luaconfsLocal->protobufMaskV4, luaconfsLocal->protobufMaskV6, dc->d_uuid, dc->d_source, dc->d_destination, dc->d_ednssubnet.source, true, dh->id, conn->qlen, qname, qtype, qclass, dc->d_policyTags, dc->d_requestorId, dc->d_deviceId);