|
11 | 11 | #include "IPSecLayer.h" |
12 | 12 | #include "VrrpLayer.h" |
13 | 13 | #include "PacketUtils.h" |
14 | | -#include <sstream> |
15 | 14 | #include "Logger.h" |
16 | 15 | #include "EndianPortable.h" |
| 16 | +#include <sstream> |
| 17 | +#include <algorithm> |
17 | 18 |
|
18 | 19 | namespace pcpp |
19 | 20 | { |
@@ -188,9 +189,9 @@ namespace pcpp |
188 | 189 | // value of totalLen and look at the data captured on the wire |
189 | 190 | if ((totalLen < m_DataLen) && (totalLen != 0)) |
190 | 191 | { |
191 | | - auto headerLen = getHeaderLen(); |
| 192 | + auto headerLen = (std::min)(getHeaderLen(), m_DataLen); |
192 | 193 | // Make sure totalLen is larger than header len, otherwise it's a malformed packet |
193 | | - m_DataLen = totalLen > headerLen ? totalLen : headerLen; |
| 194 | + m_DataLen = (std::max)(totalLen, headerLen); |
194 | 195 | } |
195 | 196 | } |
196 | 197 | } |
@@ -370,7 +371,7 @@ namespace pcpp |
370 | 371 |
|
371 | 372 | void IPv4Layer::computeCalculateFields() |
372 | 373 | { |
373 | | - iphdr* ipHdr = getIPv4Header(); |
| 374 | + auto* ipHdr = getIPv4Header(); |
374 | 375 | ipHdr->ipVersion = (4 & 0x0f); |
375 | 376 | ipHdr->totalLength = htobe16(m_DataLen); |
376 | 377 | ipHdr->headerChecksum = 0; |
@@ -406,7 +407,8 @@ namespace pcpp |
406 | 407 | } |
407 | 408 | } |
408 | 409 |
|
409 | | - ScalarBuffer<uint16_t> scalar = { (uint16_t*)ipHdr, (size_t)(ipHdr->internetHeaderLength * 4) }; |
| 410 | + auto headerLen = (std::min)(static_cast<size_t>(ipHdr->internetHeaderLength * 4), m_DataLen); |
| 411 | + ScalarBuffer<uint16_t> scalar = { reinterpret_cast<uint16_t*>(ipHdr), headerLen }; |
410 | 412 | ipHdr->headerChecksum = htobe16(computeChecksum(&scalar, 1)); |
411 | 413 | } |
412 | 414 |
|
|
0 commit comments