Fix asan/msan bug

PiperOrigin-RevId: 780237506
This commit is contained in:
Guogang Li
2025-07-07 13:30:50 -07:00
committed by Copybara-Service
parent 6a5d39eb59
commit a2bcb2db27
15 changed files with 25 additions and 24 deletions
@@ -115,7 +115,7 @@ absl::StatusOr<BleAdvertisement> BleAdvertisement::CreateBleAdvertisement(
}
ByteArray advertisement_bytes{ble_advertisement_bytes};
StreamReader stream_reader{advertisement_bytes};
StreamReader stream_reader{&advertisement_bytes};
// The first 1 byte is supposed to be the version and pcp.
auto version_and_pcp_byte = stream_reader.ReadUint8();
if (!version_and_pcp_byte.has_value()) {
@@ -75,7 +75,7 @@ BluetoothDeviceName::BluetoothDeviceName(
return;
}
StreamReader stream_reader{bluetooth_device_name_bytes};
StreamReader stream_reader{&bluetooth_device_name_bytes};
// The first 1 byte is supposed to be the version and pcp.
auto version_and_pcp_byte = stream_reader.ReadUint8();
if (!version_and_pcp_byte.has_value()) {
@@ -32,7 +32,7 @@ constexpr absl::string_view kFakeEncryptionKey =
// Should always match the protocol implementation to read device name.
// LINT.IfChange
std::optional<std::string> ReadDeviceName(const ByteArray& endpoint_info) {
StreamReader reader(endpoint_info);
StreamReader reader(&endpoint_info);
std::optional<uint8_t> version = reader.ReadBits(3);
if (!version.has_value() || *version > 1) {
return std::nullopt;
@@ -99,7 +99,7 @@ std::optional<DataElement> DataElement::FromStreamReader(StreamReader& reader) {
std::optional<DataElement> DataElement::FromData(const std::string& data) {
ByteArray bytes(data);
StreamReader reader(bytes);
StreamReader reader(&bytes);
return FromStreamReader(reader);
}
@@ -48,7 +48,7 @@ TEST(DataElementTest, FromInvalidLength) {
TEST(DataElementTest, OneByteFromStreamReader) {
ByteArray bytes("\x21\x01\x02");
StreamReader reader(bytes);
StreamReader reader(&bytes);
std::optional<DataElement> data_element =
DataElement::FromStreamReader(reader);
ASSERT_TRUE(data_element.has_value());
@@ -59,7 +59,7 @@ TEST(DataElementTest, OneByteFromStreamReader) {
TEST(DataElementTest, TwoByteFromStreamReader) {
ByteArray bytes("\x84\x01\x01\x02\x03\x04");
StreamReader reader(bytes);
StreamReader reader(&bytes);
std::optional<DataElement> data_element =
DataElement::FromStreamReader(reader);
ASSERT_TRUE(data_element.has_value());
@@ -79,7 +79,7 @@ std::optional<DctAdvertisement> DctAdvertisement::Create(
std::optional<DctAdvertisement> DctAdvertisement::Parse(
const std::string& advertisement) {
ByteArray data(advertisement);
StreamReader reader(data);
StreamReader reader(&data);
DctAdvertisement dct_advertisement;
std::optional<uint8_t> header = reader.ReadUint8();
@@ -118,7 +118,8 @@ std::optional<DctAdvertisement> DctAdvertisement::Parse(
return std::nullopt;
}
StreamReader psm_reader(ByteArray(psm->value()));
ByteArray psm_bytes(psm->value());
StreamReader psm_reader(&psm_bytes);
dct_advertisement.psm_ = psm_reader.ReadUint16().value_or(0);
// Read device information
@@ -100,7 +100,7 @@ absl::StatusOr<BleAdvertisement> BleAdvertisement::CreateBleAdvertisement(
}
ByteArray advertisement_bytes(ble_advertisement_bytes);
StreamReader stream_reader(advertisement_bytes);
StreamReader stream_reader(&advertisement_bytes);
// The first 1 byte is supposed to be the version, socket version and the fast
// advertisement flag.
auto version_byte = stream_reader.ReadUint8();
@@ -308,7 +308,7 @@ BleAdvertisement::BleExtraFields::BleExtraFields(
}
ByteArray mutated_extra_fields_bytes = {ble_extra_fields_bytes};
StreamReader stream_reader{mutated_extra_fields_bytes};
StreamReader stream_reader{&mutated_extra_fields_bytes};
// The first 1 byte is field mask.
auto mask_byte = stream_reader.ReadUint8().value_or(0);
if (!mask_byte) {
@@ -86,7 +86,7 @@ BleAdvertisementHeader::BleAdvertisementHeader(
return;
}
StreamReader stream_reader(advertisement_header_bytes);
StreamReader stream_reader(&advertisement_header_bytes);
// The first 1 byte is supposed to be the version and number of slots.
auto version_and_num_slots_byte = stream_reader.ReadUint8();
if (!version_and_num_slots_byte.has_value()) {
@@ -51,7 +51,7 @@ absl::StatusOr<BleL2capPacket> BleL2capPacket::CreateFromBytes(
"Cannot deserialize BleL2capPacket: input bytes too short.");
}
StreamReader stream_reader(bytes);
StreamReader stream_reader(&bytes);
// The first 1 byte is the command.
auto command_byte = stream_reader.ReadUint8();
if (!command_byte.has_value()) {
@@ -137,7 +137,7 @@ BlePacket::BlePacket(const ByteArray& ble_packet_bytes) {
}
ByteArray packet_bytes(ble_packet_bytes);
StreamReader stream_reader{packet_bytes};
StreamReader stream_reader{&packet_bytes};
// The first 3 bytes are supposed to be the service_id_hash.
auto service_id_hash_bytes = stream_reader.ReadBytes(kServiceIdHashLength);
if (!service_id_hash_bytes.has_value()) {
@@ -96,7 +96,7 @@ WifiLanServiceInfo::WifiLanServiceInfo(const NsdServiceInfo& nsd_service_info) {
return;
}
StreamReader stream_reader{service_info_bytes};
StreamReader stream_reader{&service_info_bytes};
// The first 1 byte is supposed to be the version and pcp.
auto version_and_pcp_byte = stream_reader.ReadUint8();
if (!version_and_pcp_byte.has_value()) {
+1 -1
View File
@@ -27,7 +27,7 @@ std::string ByteUtils::ToFourDigitString(ByteArray& bytes) {
int multiplier = 1;
int hashCode = 0;
StreamReader stream_reader{bytes};
StreamReader stream_reader{&bytes};
while (stream_reader.IsAvailable(1)) {
auto byte = stream_reader.ReadInt8().value_or(0);
hashCode = (hashCode + byte * multiplier) % kHashBasePrime;
+2 -2
View File
@@ -31,7 +31,7 @@ std::optional<std::uint8_t> StreamReader::ReadBits(int bits) {
if (!IsAvailable(1)) {
return std::nullopt;
}
bits_buffer_ = (uint8_t)buffer_.data()[position_++];
bits_buffer_ = (uint8_t)buffer_->data()[position_++];
bits_unused_ = 8;
}
if (bits_unused_ < bits) {
@@ -177,7 +177,7 @@ ExceptionOr<ByteArray> StreamReader::Read(std::int64_t size) {
}
ByteArray read_bytes{static_cast<size_t>(size)};
if (read_bytes.CopyAt(/*offset=*/0, buffer_,
if (read_bytes.CopyAt(/*offset=*/0, *buffer_,
/*source_offset=*/position_)) {
position_ += size;
return ExceptionOr<ByteArray>{read_bytes};
+3 -3
View File
@@ -27,7 +27,7 @@ namespace nearby {
// A base {@link InputStream } for reading the contents of a byte array.
class StreamReader {
public:
explicit StreamReader(const ByteArray &buffer) : buffer_{buffer} {}
explicit StreamReader(const ByteArray *buffer) : buffer_{buffer} {}
StreamReader(const StreamReader &) = delete;
StreamReader &operator=(const StreamReader &) = delete;
~StreamReader() = default;
@@ -46,7 +46,7 @@ class StreamReader {
std::optional<ByteArray> ReadBytes(int size);
bool IsAvailable(int size) const {
return buffer_.size() - position_ >= size;
return buffer_ != nullptr && (buffer_->size() - position_ >= size);
}
private:
@@ -54,7 +54,7 @@ class StreamReader {
uint8_t bits_unused_{0};
uint8_t bits_buffer_{0};
const ByteArray &buffer_;
const ByteArray *buffer_ = nullptr;
size_t position_{0};
};
+4 -4
View File
@@ -25,7 +25,7 @@ namespace {
TEST(StreamReaderTest, ReadBits) {
std::string data{static_cast<char>(0b01011100)};
ByteArray byte_array(data);
StreamReader stream{byte_array};
StreamReader stream{&byte_array};
EXPECT_EQ(stream.ReadBits(1), 0);
EXPECT_EQ(stream.ReadBits(2), 2);
EXPECT_EQ(stream.ReadBits(3), 7);
@@ -37,7 +37,7 @@ TEST(StreamReaderTest, ReadBits) {
TEST(StreamReaderTest, ReadBitsExceedsByteBoundary) {
std::string data = "ab";
ByteArray byte_array(data);
StreamReader stream{byte_array};
StreamReader stream{&byte_array};
EXPECT_FALSE(stream.ReadBits(9).has_value());
EXPECT_EQ(stream.ReadBits(1), 0);
EXPECT_FALSE(stream.ReadInt16().has_value());
@@ -46,7 +46,7 @@ TEST(StreamReaderTest, ReadBitsExceedsByteBoundary) {
TEST(StreamReaderTest, ReadUintValues) {
std::string data = "\xff\xf1\x0f\x0e\x01\x02\x01\x01\x01\x02\x03\x04\x05\x06";
ByteArray byte_array(data);
StreamReader stream{byte_array};
StreamReader stream{&byte_array};
EXPECT_EQ(stream.ReadUint16(), 0xfff1);
EXPECT_EQ(stream.ReadUint32(), 0x0f0e0102);
EXPECT_EQ(stream.ReadUint64(), 0x0101010203040506);
@@ -55,7 +55,7 @@ TEST(StreamReaderTest, ReadUintValues) {
TEST(StreamReaderTest, ReadIntValues) {
std::string data = "\xff\xf1\x0f\x0e\x01\x02\x01\x01\x01\x02\x03\x04\x05\x06";
ByteArray byte_array(data);
StreamReader stream{byte_array};
StreamReader stream{&byte_array};
EXPECT_EQ(stream.ReadInt16(), static_cast<int16_t>(0xfff1));
EXPECT_EQ(stream.ReadInt32(), static_cast<int32_t>(0x0f0e0102));
EXPECT_EQ(stream.ReadInt64(), static_cast<int64_t>(0x0101010203040506));