diff options
| -rw-r--r-- | include/io/stream_reader.h | 1 | ||||
| -rw-r--r-- | src/io/stream_reader.cpp | 5 |
2 files changed, 6 insertions, 0 deletions
diff --git a/include/io/stream_reader.h b/include/io/stream_reader.h index 469e18ce87..3a677db748 100644 --- a/include/io/stream_reader.h +++ b/include/io/stream_reader.h @@ -121,6 +121,7 @@ public: private: std::istream& is; + int depth = 0; const endian::endian endian; }; diff --git a/src/io/stream_reader.cpp b/src/io/stream_reader.cpp index f6f30a5b49..cf0dee38e8 100644 --- a/src/io/stream_reader.cpp +++ b/src/io/stream_reader.cpp @@ -27,6 +27,8 @@ namespace nbt namespace io { +constexpr int MAX_DEPTH = 1024; + std::pair<std::string, std::unique_ptr<tag_compound>> read_compound(std::istream& is, endian::endian e) { return stream_reader(is, e).read_compound(); @@ -74,8 +76,11 @@ std::pair<std::string, std::unique_ptr<tag>> stream_reader::read_tag() std::unique_ptr<tag> stream_reader::read_payload(tag_type type) { + if (++depth > MAX_DEPTH) + throw input_error("Too deeply nested"); std::unique_ptr<tag> t = tag::create(type); t->read_payload(*this); + --depth; return t; } |
