| 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
|
|
|