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() {
|
Compound::Compound() {
|
||||||
this->type = TagType::COMPOUND;
|
this->type = TagType::COMPOUND;
|
||||||
|
this->endPointer = new End();
|
||||||
}
|
}
|
||||||
|
|
||||||
Compound::Compound(tiny_utf8::string name) {
|
Compound::Compound(tiny_utf8::string name) {
|
||||||
this->type = TagType::COMPOUND;
|
this->type = TagType::COMPOUND;
|
||||||
this->name = name;
|
this->name = name;
|
||||||
|
this->endPointer = new End();
|
||||||
}
|
}
|
||||||
|
|
||||||
Compound::Compound(tiny_utf8::string name, std::vector<Generic*> data) {
|
Compound::Compound(tiny_utf8::string name, std::vector<Generic*> data) {
|
||||||
this->type = TagType::COMPOUND;
|
this->type = TagType::COMPOUND;
|
||||||
this->name = name;
|
this->name = name;
|
||||||
this->tags = data;
|
this->tags = data;
|
||||||
|
this->endPointer = new End();
|
||||||
}
|
}
|
||||||
|
|
||||||
Compound::~Compound() {
|
Compound::~Compound() {
|
||||||
for (uint64_t i=0; i<this->tags.size(); i++) {
|
for (uint64_t i=0; i<this->tags.size(); i++) {
|
||||||
delete this->tags.at(i);
|
delete this->tags.at(i);
|
||||||
}
|
}
|
||||||
|
delete this->endPointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOrVoid Compound::serializeWithoutHeader(std::vector<uint8_t>* rawData) {
|
ErrorOrVoid Compound::serializeWithoutHeader(std::vector<uint8_t>* rawData) {
|
||||||
|
@ -966,20 +970,29 @@ namespace NBT {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this->endPointer->serialize(rawData);
|
||||||
|
|
||||||
return ErrorOrVoid();
|
return ErrorOrVoid();
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOr<Generic*> Compound::getElementPointer(uint64_t position) {
|
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);
|
return ErrorOr<Generic*>(true, ErrorCodes::OUT_OF_RANGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (position == this->tags.size()) {
|
||||||
|
return this->endPointer;
|
||||||
|
}
|
||||||
|
|
||||||
return ErrorOr<Generic*>(this->tags.at(position));
|
return ErrorOr<Generic*>(this->tags.at(position));
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOrVoid Compound::setElementPointerAt(uint64_t position, Generic* pointer) {
|
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);
|
return ErrorOrVoid(true, ErrorCodes::OUT_OF_RANGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -994,7 +1007,11 @@ namespace NBT {
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorOrVoid Compound::deleteElement(uint64_t position) {
|
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);
|
return ErrorOrVoid(true, ErrorCodes::OUT_OF_RANGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1005,7 +1022,8 @@ namespace NBT {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t Compound::length() {
|
uint64_t Compound::length() {
|
||||||
return this->tags.size();
|
// account for built-in end tag
|
||||||
|
return this->tags.size()+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Int32Array::Int32Array() {
|
Int32Array::Int32Array() {
|
||||||
|
|
|
@ -244,6 +244,8 @@ namespace NBT {
|
||||||
class Compound: public Generic {
|
class Compound: public Generic {
|
||||||
private:
|
private:
|
||||||
std::vector<Generic*> tags;
|
std::vector<Generic*> tags;
|
||||||
|
// built-in end tag
|
||||||
|
End* endPointer;
|
||||||
public:
|
public:
|
||||||
Compound();
|
Compound();
|
||||||
Compound(tiny_utf8::string name);
|
Compound(tiny_utf8::string name);
|
||||||
|
|
Loading…
Reference in New Issue