Since inline void WriteVarint(uint64_t val, std::string* s) accept val as uint64_t at
|
inline void WriteVarint(uint64_t val, std::string* s) { |
|
while (val >= 128) { |
|
uint8_t c = val | 0x80; |
|
s->push_back(c); |
|
val >>= 7; |
|
} |
|
s->push_back(val); |
|
} |
But void WriteVarint(uint32_t num, uint64_t val, std::string* s) has num as uint32_t
|
void WriteVarint(uint32_t num, uint64_t val, std::string* s) { |
|
WriteVarint(num << 3, s); |
|
WriteVarint(val, s); |
|
} |
And there is no cast of "num"
overflow could happen at
|
WriteVarint(num << 3, s); |
Fix:
inline void WriteVarint(uint32_t num, uint64_t val, std::string* s) {
// Cast num to uint64_t to prevent overflow during the shift operation
WriteVarint(static_cast<uint64_t>(num) << 3, s);
WriteVarint(val, s);
}
Since inline void WriteVarint(uint64_t val, std::string* s) accept val as uint64_t at
protobuf/src/google/protobuf/parse_context.cc
Lines 316 to 323 in f587cf5
But void WriteVarint(uint32_t num, uint64_t val, std::string* s) has num as uint32_t
protobuf/src/google/protobuf/parse_context.cc
Lines 325 to 328 in f587cf5
And there is no cast of "num"
overflow could happen at
protobuf/src/google/protobuf/parse_context.cc
Line 326 in f587cf5
Fix: