lib/nbt: Build an end tag object into compound tag objects to prevent creation of endless compounds
							parent
							
								
									ccce564219
								
							
						
					
					
						commit
						71834e1018
					
				|  | @ -940,23 +940,27 @@ namespace NBT { | |||
| 
 | ||||
|         Compound::Compound() { | ||||
|             this->type = TagType::COMPOUND; | ||||
|             this->endPointer = new End(); | ||||
|         } | ||||
| 
 | ||||
|         Compound::Compound(tiny_utf8::string name) { | ||||
|             this->type = TagType::COMPOUND; | ||||
|             this->name = name; | ||||
|             this->endPointer = new End(); | ||||
|         } | ||||
| 
 | ||||
|         Compound::Compound(tiny_utf8::string name, std::vector<Generic*> data) { | ||||
|             this->type = TagType::COMPOUND; | ||||
|             this->name = name; | ||||
|             this->tags = data; | ||||
|             this->endPointer = new End(); | ||||
|         } | ||||
| 
 | ||||
|         Compound::~Compound() { | ||||
|             for (uint64_t i=0; i<this->tags.size(); i++) { | ||||
|                 delete this->tags.at(i); | ||||
|             } | ||||
|             delete this->endPointer; | ||||
|         } | ||||
| 
 | ||||
|         ErrorOrVoid Compound::serializeWithoutHeader(std::vector<uint8_t>* rawData) { | ||||
|  | @ -966,20 +970,29 @@ namespace NBT { | |||
|                     return result; | ||||
|                 } | ||||
|             } | ||||
|             this->endPointer->serialize(rawData); | ||||
| 
 | ||||
|             return ErrorOrVoid(); | ||||
|         } | ||||
| 
 | ||||
|         ErrorOr<Generic*> Compound::getElementPointer(uint64_t position) { | ||||
|             if (position >= this->tags.size()) { | ||||
|             if (position > this->tags.size()) { | ||||
|                 return ErrorOr<Generic*>(true, ErrorCodes::OUT_OF_RANGE); | ||||
|             } | ||||
| 
 | ||||
|             if (position == this->tags.size()) { | ||||
|                 return this->endPointer; | ||||
|             } | ||||
| 
 | ||||
|             return ErrorOr<Generic*>(this->tags.at(position)); | ||||
|         } | ||||
| 
 | ||||
|         ErrorOrVoid Compound::setElementPointerAt(uint64_t position, Generic* pointer) { | ||||
|             if (position >= this->tags.size()) { | ||||
|             // built-in end tag
 | ||||
|             if (position == this->tags.size()) { | ||||
|                 return ErrorOrVoid(true, ErrorCodes::NOT_ALLOWED); | ||||
|             } | ||||
|             if (position > this->tags.size()) { | ||||
|                 return ErrorOrVoid(true, ErrorCodes::OUT_OF_RANGE); | ||||
|             } | ||||
| 
 | ||||
|  | @ -994,7 +1007,11 @@ namespace NBT { | |||
|         } | ||||
| 
 | ||||
|         ErrorOrVoid Compound::deleteElement(uint64_t position) { | ||||
|             if (position >= this->tags.size()) { | ||||
|             // built-in end tag
 | ||||
|             if (position == this->tags.size()) { | ||||
|                 return ErrorOrVoid(true, ErrorCodes::NOT_ALLOWED); | ||||
|             } | ||||
|             if (position > this->tags.size()) { | ||||
|                 return ErrorOrVoid(true, ErrorCodes::OUT_OF_RANGE); | ||||
|             } | ||||
| 
 | ||||
|  | @ -1005,7 +1022,8 @@ namespace NBT { | |||
|         } | ||||
| 
 | ||||
|         uint64_t Compound::length() { | ||||
|             return this->tags.size(); | ||||
|             // account for built-in end tag
 | ||||
|             return this->tags.size()+1; | ||||
|         } | ||||
| 
 | ||||
|         Int32Array::Int32Array() { | ||||
|  |  | |||
|  | @ -244,6 +244,8 @@ namespace NBT { | |||
|         class Compound: public Generic { | ||||
|             private: | ||||
|                 std::vector<Generic*> tags; | ||||
|                 // built-in end tag
 | ||||
|                 End* endPointer; | ||||
|             public: | ||||
|                 Compound(); | ||||
|                 Compound(tiny_utf8::string name); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 BodgeMaster
						BodgeMaster