diff options
author | snaury <snaury@ydb.tech> | 2023-06-30 17:59:33 +0300 |
---|---|---|
committer | snaury <snaury@ydb.tech> | 2023-06-30 17:59:33 +0300 |
commit | 28d022615dc76103427a08b312d786916fefbb7c (patch) | |
tree | 88a60e6bf0f8bf51cf834ab9c93f819cd2699eb7 | |
parent | 5edc77d449e4677659690694f176b358ff7087f5 (diff) | |
download | ydb-28d022615dc76103427a08b312d786916fefbb7c.tar.gz |
Use unaligned read/write in persqueue to fix ubsan failures
-rw-r--r-- | ydb/core/persqueue/blob.cpp | 31 | ||||
-rw-r--r-- | ydb/core/persqueue/sourceid.cpp | 2 |
2 files changed, 16 insertions, 17 deletions
diff --git a/ydb/core/persqueue/blob.cpp b/ydb/core/persqueue/blob.cpp index ca788a06028..eeb2e231510 100644 --- a/ydb/core/persqueue/blob.cpp +++ b/ydb/core/persqueue/blob.cpp @@ -211,9 +211,8 @@ void WriteActualChunkSize(TBuffer& output, ui32 sizeOffset) Y_VERIFY(currSize >= sizeOffset + sizeof(ui32)); ui32 size = currSize - sizeOffset - sizeof(ui32); - ui32* sizePlacement = (ui32*)(output.data() + sizeOffset); - Y_VERIFY_DEBUG(*sizePlacement == CHUNK_SIZE_PLACEMENT); - *sizePlacement = size; + Y_VERIFY_DEBUG(ReadUnaligned<ui32>(output.data() + sizeOffset) == CHUNK_SIZE_PLACEMENT); + WriteUnaligned<ui32>(output.data() + sizeOffset, size); } void TBatch::Pack() { @@ -466,12 +465,12 @@ void TBatch::UnpackToType1(TVector<TClientBlob> *blobs) { auto chunk = NScheme::IChunkDecoder::ReadChunk(GetChunk(data, dataEnd), &ui32Codecs); auto iter = chunk->MakeIterator(); for (ui32 i = 0; i < totalBlobs; ++i) { - pos.push_back(*((ui32*)iter->Next().Data())); + pos.push_back(ReadUnaligned<ui32>(iter->Next().Data())); } - sourceIdCount = *((ui32*)iter->Next().Data()); + sourceIdCount = ReadUnaligned<ui32>(iter->Next().Data()); end.reserve(sourceIdCount); for (ui32 i = 0; i < sourceIdCount; ++i) { - end.push_back(*((ui32*)iter->Next().Data())); + end.push_back(ReadUnaligned<ui32>(iter->Next().Data())); } } @@ -493,7 +492,7 @@ void TBatch::UnpackToType1(TVector<TClientBlob> *blobs) { auto chunk = NScheme::IChunkDecoder::ReadChunk(GetChunk(data, dataEnd), &ui64Codecs); auto iter = chunk->MakeIterator(); for (ui32 i = 0; i < totalBlobs; ++i) { - seqNo.push_back(*(ui64*)iter->Next().Data()); + seqNo.push_back(ReadUnaligned<ui64>(iter->Next().Data())); } } TVector<TString> dt; @@ -514,13 +513,13 @@ void TBatch::UnpackToType1(TVector<TClientBlob> *blobs) { { auto chunk = NScheme::IChunkDecoder::ReadChunk(GetChunk(data, dataEnd), &ui32Codecs); auto iter = chunk->MakeIterator(); - partsSize = *(ui32*)iter->Next().Data(); + partsSize = ReadUnaligned<ui32>(iter->Next().Data()); partData.reserve(partsSize); for (ui32 i = 0; i < partsSize; ++i) { - ui32 ps = *(ui32*)iter->Next().Data(); - ui16 partNo = *(ui32*)iter->Next().Data(); - ui16 totalParts = *(ui32*)iter->Next().Data(); - ui32 totalSize = *(ui32*)iter->Next().Data(); + ui32 ps = ReadUnaligned<ui32>(iter->Next().Data()); + ui16 partNo = ReadUnaligned<ui32>(iter->Next().Data()); + ui16 totalParts = ReadUnaligned<ui32>(iter->Next().Data()); + ui32 totalSize = ReadUnaligned<ui32>(iter->Next().Data()); partData.insert(std::make_pair(ps, TPartData(partNo, totalParts, totalSize))); } } @@ -530,7 +529,7 @@ void TBatch::UnpackToType1(TVector<TClientBlob> *blobs) { auto chunk = NScheme::IChunkDecoder::ReadChunk(GetChunk(data, dataEnd), &ui64Codecs); auto iter = chunk->MakeIterator(); for (ui32 i = 0; i < totalBlobs; ++i) { - ui64 timestampMs = *(ui64*)iter->Next().Data(); + ui64 timestampMs = ReadUnaligned<ui64>(iter->Next().Data()); wtime.push_back(TInstant::MilliSeconds(timestampMs)); } } @@ -569,7 +568,7 @@ void TBatch::UnpackToType1(TVector<TClientBlob> *blobs) { auto chunk = NScheme::IChunkDecoder::ReadChunk(GetChunk(data, dataEnd), &ui64Codecs); auto iter = chunk->MakeIterator(); for (ui32 i = 0; i < totalBlobs; ++i) { - ui64 timestampMs = *(ui64*)iter->Next().Data(); + ui64 timestampMs = ReadUnaligned<ui64>(iter->Next().Data()); ctime.push_back(TInstant::MilliSeconds(timestampMs)); } } @@ -584,7 +583,7 @@ void TBatch::UnpackToType1(TVector<TClientBlob> *blobs) { auto chunk = NScheme::IChunkDecoder::ReadChunk(GetChunk(data, dataEnd), &ui64Codecs); auto iter = chunk->MakeIterator(); for (ui32 i = 0; i < totalBlobs; ++i) { - uncompressedSize.push_back(*(ui64*)iter->Next().Data()); + uncompressedSize.push_back(ReadUnaligned<ui64>(iter->Next().Data())); } } } else { @@ -615,7 +614,7 @@ void TBatch::UnpackToType0(TVector<TClientBlob> *blobs) { for (ui32 i = 0; i < GetCount() + GetInternalPartsCount(); ++i) { Y_VERIFY(shift < PackedData.size()); blobs->push_back(TClientBlob::Deserialize(PackedData.data() + shift, PackedData.size() - shift)); - shift += *(ui32*)(PackedData.data() + shift); + shift += ReadUnaligned<ui32>(PackedData.data() + shift); } Y_VERIFY(shift == PackedData.size()); } diff --git a/ydb/core/persqueue/sourceid.cpp b/ydb/core/persqueue/sourceid.cpp index 01ddfa653d9..2eb8ea0a40f 100644 --- a/ydb/core/persqueue/sourceid.cpp +++ b/ydb/core/persqueue/sourceid.cpp @@ -15,7 +15,7 @@ static constexpr ui64 MAX_DELETE_COMMAND_COUNT = 1000; template <typename T> T ReadAs(const TString& data, ui32& pos) { - auto result = *((T*)(data.c_str() + pos)); + auto result = ReadUnaligned<T>(data.c_str() + pos); pos += sizeof(T); return result; } |