kadircet created this revision. kadircet added a reviewer: sammccall. Herald added subscribers: cfe-commits, usaxena95, arphaman. Herald added a project: clang. kadircet requested review of this revision. Herald added subscribers: MaskRay, ilya-biryukov.
5th byte of a varint can't be bigger than 0x0f, fix a test and add an assertion. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D91405 Files: clang-tools-extra/clangd/index/Serialization.cpp clang-tools-extra/clangd/unittests/SerializationTests.cpp Index: clang-tools-extra/clangd/unittests/SerializationTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/SerializationTests.cpp +++ clang-tools-extra/clangd/unittests/SerializationTests.cpp @@ -366,9 +366,9 @@ Pos += FileDigest.size(); // Varints are little-endian base-128 numbers, where the top-bit of each byte - // indicates whether there are more. 8fffffff7f -> 0xffffffff. + // indicates whether there are more. 8fffffff0f -> 0xffffffff. std::string CorruptSrcs = - (Srcs->Data.take_front(Pos) + llvm::fromHex("8fffffff7f") + + (Srcs->Data.take_front(Pos) + llvm::fromHex("8fffffff0f") + "some_random_garbage") .str(); Srcs->Data = CorruptSrcs; Index: clang-tools-extra/clangd/index/Serialization.cpp =================================================================== --- clang-tools-extra/clangd/index/Serialization.cpp +++ clang-tools-extra/clangd/index/Serialization.cpp @@ -87,6 +87,7 @@ uint32_t Val = B & ~More; for (int Shift = 7; B & More && Shift < 32; Shift += 7) { B = consume8(); + assert((B & ~More) < (1 << (32 - Shift)) && "Invalid varint encoding"); Val |= (B & ~More) << Shift; } return Val;
Index: clang-tools-extra/clangd/unittests/SerializationTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/SerializationTests.cpp +++ clang-tools-extra/clangd/unittests/SerializationTests.cpp @@ -366,9 +366,9 @@ Pos += FileDigest.size(); // Varints are little-endian base-128 numbers, where the top-bit of each byte - // indicates whether there are more. 8fffffff7f -> 0xffffffff. + // indicates whether there are more. 8fffffff0f -> 0xffffffff. std::string CorruptSrcs = - (Srcs->Data.take_front(Pos) + llvm::fromHex("8fffffff7f") + + (Srcs->Data.take_front(Pos) + llvm::fromHex("8fffffff0f") + "some_random_garbage") .str(); Srcs->Data = CorruptSrcs; Index: clang-tools-extra/clangd/index/Serialization.cpp =================================================================== --- clang-tools-extra/clangd/index/Serialization.cpp +++ clang-tools-extra/clangd/index/Serialization.cpp @@ -87,6 +87,7 @@ uint32_t Val = B & ~More; for (int Shift = 7; B & More && Shift < 32; Shift += 7) { B = consume8(); + assert((B & ~More) < (1 << (32 - Shift)) && "Invalid varint encoding"); Val |= (B & ~More) << Shift; } return Val;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits