Merge pull request #426 from malirod/fix-ub-in-document
Fix UB in GenericDocument::ParseStream
This commit is contained in:
commit
221887d682
@ -1887,7 +1887,8 @@ public:
|
|||||||
template <unsigned parseFlags, typename SourceEncoding, typename InputStream>
|
template <unsigned parseFlags, typename SourceEncoding, typename InputStream>
|
||||||
GenericDocument& ParseStream(InputStream& is) {
|
GenericDocument& ParseStream(InputStream& is) {
|
||||||
ValueType::SetNull(); // Remove existing root if exist
|
ValueType::SetNull(); // Remove existing root if exist
|
||||||
GenericReader<SourceEncoding, Encoding, StackAllocator> reader(&stack_.GetAllocator());
|
GenericReader<SourceEncoding, Encoding, StackAllocator> reader(
|
||||||
|
stack_.HasAllocator() ? &stack_.GetAllocator() : 0);
|
||||||
ClearStackOnExit scope(*this);
|
ClearStackOnExit scope(*this);
|
||||||
parseResult_ = reader.template Parse<parseFlags>(is, *this);
|
parseResult_ = reader.template Parse<parseFlags>(is, *this);
|
||||||
if (parseResult_) {
|
if (parseResult_) {
|
||||||
@ -1989,7 +1990,10 @@ public:
|
|||||||
//!@}
|
//!@}
|
||||||
|
|
||||||
//! Get the allocator of this document.
|
//! Get the allocator of this document.
|
||||||
Allocator& GetAllocator() { return *allocator_; }
|
Allocator& GetAllocator() {
|
||||||
|
RAPIDJSON_ASSERT(allocator_);
|
||||||
|
return *allocator_;
|
||||||
|
}
|
||||||
|
|
||||||
//! Get the capacity of stack in bytes.
|
//! Get the capacity of stack in bytes.
|
||||||
size_t GetStackCapacity() const { return stack_.GetCapacity(); }
|
size_t GetStackCapacity() const { return stack_.GetCapacity(); }
|
||||||
|
@ -134,7 +134,14 @@ public:
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
T* Bottom() { return (T*)stack_; }
|
T* Bottom() { return (T*)stack_; }
|
||||||
|
|
||||||
Allocator& GetAllocator() { return *allocator_; }
|
bool HasAllocator() const {
|
||||||
|
return allocator_ != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Allocator& GetAllocator() {
|
||||||
|
RAPIDJSON_ASSERT(allocator_);
|
||||||
|
return *allocator_;
|
||||||
|
}
|
||||||
bool Empty() const { return stackTop_ == stack_; }
|
bool Empty() const { return stackTop_ == stack_; }
|
||||||
size_t GetSize() const { return static_cast<size_t>(stackTop_ - stack_); }
|
size_t GetSize() const { return static_cast<size_t>(stackTop_ - stack_); }
|
||||||
size_t GetCapacity() const { return static_cast<size_t>(stackEnd_ - stack_); }
|
size_t GetCapacity() const { return static_cast<size_t>(stackEnd_ - stack_); }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user