Coverage Report

Created: 2026-02-14 07:19

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/PcapPlusPlus/Packet++/src/DnsResourceData.cpp
Line
Count
Source
1
0
#define LOG_MODULE PacketLogModuleDnsLayer
2
3
#include "DnsResourceData.h"
4
#include "Logger.h"
5
#include "GeneralUtils.h"
6
#include <sstream>
7
#include <utility>
8
#include "EndianPortable.h"
9
10
namespace pcpp
11
{
12
13
  size_t IDnsResourceData::decodeName(const char* encodedName, char* result, IDnsResource* dnsResource) const
14
0
  {
15
0
    if (dnsResource == nullptr)
16
0
    {
17
0
      PCPP_LOG_ERROR("Cannot decode name, DNS resource object is nullptr");
18
0
      return 0;
19
0
    }
20
21
0
    return dnsResource->decodeName(encodedName, result);
22
0
  }
23
24
  void IDnsResourceData::encodeName(const std::string& decodedName, char* result, size_t& resultLen,
25
                                    IDnsResource* dnsResource) const
26
0
  {
27
0
    if (dnsResource == nullptr)
28
0
    {
29
0
      PCPP_LOG_ERROR("Cannot encode name, DNS resource object is nullptr");
30
0
      return;
31
0
    }
32
33
0
    dnsResource->encodeName(decodedName, result, resultLen);
34
0
  }
35
36
  StringDnsResourceData::StringDnsResourceData(const uint8_t* dataPtr, size_t dataLen, IDnsResource* dnsResource)
37
0
  {
38
0
    if (dataPtr && dataLen > 0)
39
0
    {
40
0
      char tempResult[4096];
41
0
      decodeName((const char*)dataPtr, tempResult, dnsResource);
42
0
      m_Data = tempResult;
43
0
    }
44
0
    else
45
0
      PCPP_LOG_ERROR("Cannot decode name, dataPtr is nullptr or length is 0");
46
0
  }
47
48
  bool StringDnsResourceData::toByteArr(uint8_t* arr, size_t& arrLength, IDnsResource* dnsResource) const
49
0
  {
50
0
    encodeName(m_Data, (char*)arr, arrLength, dnsResource);
51
0
    return true;
52
0
  }
53
54
  IPv4DnsResourceData::IPv4DnsResourceData(const uint8_t* dataPtr, size_t dataLen)
55
0
  {
56
0
    if (dataLen != 4)
57
0
    {
58
0
      PCPP_LOG_ERROR("DNS type is A but resource length is not 4 - malformed data");
59
0
      return;
60
0
    }
61
62
0
    uint32_t addrAsInt = *(uint32_t*)dataPtr;
63
0
    m_Data = IPv4Address(addrAsInt);
64
0
  }
65
66
  bool IPv4DnsResourceData::toByteArr(uint8_t* arr, size_t& arrLength, IDnsResource*) const
67
42.0k
  {
68
42.0k
    arrLength = sizeof(uint32_t);
69
42.0k
    memcpy(arr, m_Data.toBytes(), sizeof(uint32_t));
70
42.0k
    return true;
71
42.0k
  }
72
73
  IPv6DnsResourceData::IPv6DnsResourceData(const uint8_t* dataPtr, size_t dataLen)
74
0
  {
75
0
    if (dataLen != 16)
76
0
    {
77
0
      PCPP_LOG_ERROR("DNS type is AAAA but resource length is not 16 - malformed data");
78
0
      return;
79
0
    }
80
81
0
    m_Data = IPv6Address(dataPtr);
82
0
  }
83
84
  bool IPv6DnsResourceData::toByteArr(uint8_t* arr, size_t& arrLength, IDnsResource*) const
85
0
  {
86
0
    arrLength = 16;
87
0
    m_Data.copyTo(arr);
88
0
    return true;
89
0
  }
90
91
  MxDnsResourceData::MxDnsResourceData(uint8_t* dataPtr, size_t dataLen, IDnsResource* dnsResource)
92
0
  {
93
0
    if (dataPtr && dataLen > 0)
94
0
    {
95
0
      uint16_t preference = be16toh(*(uint16_t*)dataPtr);
96
0
      char tempMX[4096];
97
0
      decodeName((const char*)(dataPtr + sizeof(preference)), tempMX, dnsResource);
98
0
      m_Data.preference = preference;
99
0
      m_Data.mailExchange = tempMX;
100
0
    }
101
0
    else
102
0
      PCPP_LOG_ERROR("Cannot decode name, dataPtr is nullptr or length is 0");
103
0
  }
104
105
  MxDnsResourceData::MxDnsResourceData(const uint16_t& preference, const std::string& mailExchange)
106
0
  {
107
0
    m_Data.preference = preference;
108
0
    m_Data.mailExchange = mailExchange;
109
0
  }
110
111
  bool MxDnsResourceData::operator==(const MxDnsResourceData& other) const
112
0
  {
113
0
    return (m_Data.preference == other.m_Data.preference) && (m_Data.mailExchange == other.m_Data.mailExchange);
114
0
  }
115
116
  void MxDnsResourceData::setMxData(uint16_t preference, std::string mailExchange)
117
0
  {
118
0
    m_Data.preference = preference;
119
0
    m_Data.mailExchange = std::move(mailExchange);
120
0
  }
121
122
  std::string MxDnsResourceData::toString() const
123
0
  {
124
0
    std::stringstream result;
125
0
    result << "pref: " << m_Data.preference << "; mx: " << m_Data.mailExchange;
126
0
    return result.str();
127
0
  }
128
129
  bool MxDnsResourceData::toByteArr(uint8_t* arr, size_t& arrLength, IDnsResource* dnsResource) const
130
0
  {
131
0
    uint16_t netOrderPreference = htobe16(m_Data.preference);
132
0
    memcpy(arr, &netOrderPreference, sizeof(uint16_t));
133
0
    encodeName(m_Data.mailExchange, (char*)(arr + sizeof(uint16_t)), arrLength, dnsResource);
134
0
    arrLength += sizeof(uint16_t);
135
136
0
    return true;
137
0
  }
138
139
  GenericDnsResourceData::GenericDnsResourceData(const uint8_t* dataPtr, size_t dataLen)
140
0
  {
141
0
    m_Data = nullptr;
142
0
    m_DataLen = 0;
143
0
    if (dataLen > 0 && dataPtr != nullptr)
144
0
    {
145
0
      m_DataLen = dataLen;
146
0
      m_Data = new uint8_t[dataLen];
147
0
      memcpy(m_Data, dataPtr, dataLen);
148
0
    }
149
0
  }
150
151
  GenericDnsResourceData::GenericDnsResourceData(const std::string& dataAsHexString)
152
21.0k
  {
153
21.0k
    m_Data = nullptr;
154
21.0k
    uint8_t tempDataArr[2048];
155
21.0k
    m_DataLen = hexStringToByteArray(dataAsHexString, tempDataArr, 2048);
156
21.0k
    if (m_DataLen != 0)
157
21.0k
    {
158
21.0k
      m_Data = new uint8_t[m_DataLen];
159
21.0k
      memcpy(m_Data, tempDataArr, m_DataLen);
160
21.0k
    }
161
21.0k
  }
162
163
0
  GenericDnsResourceData::GenericDnsResourceData(const GenericDnsResourceData& other) : IDnsResourceData()
164
0
  {
165
0
    m_DataLen = other.m_DataLen;
166
167
0
    if (m_DataLen > 0 && other.m_Data != nullptr)
168
0
    {
169
0
      m_Data = new uint8_t[m_DataLen];
170
0
      memcpy(m_Data, other.m_Data, m_DataLen);
171
0
    }
172
0
  }
173
174
  GenericDnsResourceData& GenericDnsResourceData::operator=(const GenericDnsResourceData& other)
175
0
  {
176
0
    if (m_Data != nullptr)
177
0
      delete[] m_Data;
178
179
0
    m_Data = nullptr;
180
0
    m_DataLen = other.m_DataLen;
181
0
    if (m_DataLen > 0 && other.m_Data != nullptr)
182
0
    {
183
0
      m_Data = new uint8_t[m_DataLen];
184
0
      memcpy(m_Data, other.m_Data, m_DataLen);
185
0
    }
186
187
0
    return (*this);
188
0
  }
189
190
  bool GenericDnsResourceData::operator==(const GenericDnsResourceData& other) const
191
0
  {
192
0
    if (m_DataLen != other.m_DataLen)
193
0
      return false;
194
195
0
    return (memcmp(m_Data, other.m_Data, m_DataLen) == 0);
196
0
  }
197
198
  std::string GenericDnsResourceData::toString() const
199
0
  {
200
0
    return byteArrayToHexString(m_Data, m_DataLen);
201
0
  }
202
203
  bool GenericDnsResourceData::toByteArr(uint8_t* arr, size_t& arrLength, IDnsResource*) const
204
21.0k
  {
205
21.0k
    if (m_DataLen == 0 || m_Data == nullptr)
206
0
    {
207
0
      PCPP_LOG_ERROR("Input data is null or illegal" << "|m_DataLen:" << m_DataLen);
208
0
      return false;
209
0
    }
210
211
21.0k
    arrLength = m_DataLen;
212
21.0k
    memcpy(arr, m_Data, m_DataLen);
213
21.0k
    return true;
214
21.0k
  }
215
216
}  // namespace pcpp