Index: net/quic/core/quic_framer.cc |
diff --git a/net/quic/core/quic_framer.cc b/net/quic/core/quic_framer.cc |
index b08c020f6b256ba3c20f11aaf139a7231efcc02c..7404ebb1624bac5d7c36c8e05ea834d5be008a8a 100644 |
--- a/net/quic/core/quic_framer.cc |
+++ b/net/quic/core/quic_framer.cc |
@@ -313,7 +313,7 @@ size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header, |
const QuicFrames& frames, |
char* buffer, |
size_t packet_length) { |
- QuicDataWriter writer(packet_length, buffer, perspective_, HOST_BYTE_ORDER); |
+ QuicDataWriter writer(packet_length, buffer, perspective_, endianness()); |
if (!AppendPacketHeader(header, &writer)) { |
QUIC_BUG << "AppendPacketHeader failed"; |
return 0; |
@@ -427,8 +427,10 @@ std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildPublicResetPacket( |
size_t len = |
kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length(); |
std::unique_ptr<char[]> buffer(new char[len]); |
+ // Endianness is not a concern here, as writer is not going to write integers |
+ // or floating numbers. |
QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER, |
- HOST_BYTE_ORDER); |
+ NETWORK_BYTE_ORDER); |
uint8_t flags = static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_RST | |
PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); |
@@ -458,8 +460,10 @@ std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildVersionNegotiationPacket( |
DCHECK(!versions.empty()); |
size_t len = GetVersionNegotiationPacketSize(versions.size()); |
std::unique_ptr<char[]> buffer(new char[len]); |
+ // Endianness is not a concern here, version negotiation packet does not have |
+ // integers or floating numbers. |
QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER, |
- HOST_BYTE_ORDER); |
+ NETWORK_BYTE_ORDER); |
uint8_t flags = static_cast<uint8_t>( |
PACKET_PUBLIC_FLAGS_VERSION | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID | |
@@ -484,7 +488,7 @@ std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildVersionNegotiationPacket( |
bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { |
QuicDataReader reader(packet.data(), packet.length(), perspective_, |
- HOST_BYTE_ORDER); |
+ endianness()); |
visitor_->OnPacket(); |
@@ -510,6 +514,9 @@ bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { |
} |
} |
+ // framer's version may change, reset reader's endianness. |
+ reader.set_endianness(endianness()); |
+ |
bool rv; |
if (perspective_ == Perspective::IS_CLIENT && public_header.version_flag) { |
rv = ProcessVersionNegotiationPacket(&reader, &public_header); |
@@ -573,7 +580,7 @@ bool QuicFramer::ProcessDataPacket(QuicDataReader* encrypted_reader, |
} |
QuicDataReader reader(decrypted_buffer, decrypted_length, perspective_, |
- HOST_BYTE_ORDER); |
+ endianness()); |
// Set the last packet number after we have decrypted the packet |
// so we are confident is not attacker controlled. |
@@ -2161,4 +2168,8 @@ bool QuicFramer::RaiseError(QuicErrorCode error) { |
return false; |
} |
+Endianness QuicFramer::endianness() const { |
+ return quic_version_ > QUIC_VERSION_38 ? NETWORK_BYTE_ORDER : HOST_BYTE_ORDER; |
+} |
+ |
} // namespace net |