[ox] Fix OxFS 2 Directory test
This commit is contained in:
47
deps/ox/src/ox/ptrarith/nodebuffer.hpp
vendored
47
deps/ox/src/ox/ptrarith/nodebuffer.hpp
vendored
@@ -43,6 +43,10 @@ class __attribute__((packed)) NodeBuffer {
|
||||
return m_current;
|
||||
}
|
||||
|
||||
Item *get() {
|
||||
return m_current;
|
||||
}
|
||||
|
||||
operator Item*() {
|
||||
return m_current;
|
||||
}
|
||||
@@ -55,7 +59,7 @@ class __attribute__((packed)) NodeBuffer {
|
||||
return m_current;
|
||||
}
|
||||
|
||||
bool valid() {
|
||||
bool valid() const noexcept {
|
||||
return m_current.valid();
|
||||
}
|
||||
|
||||
@@ -70,7 +74,11 @@ class __attribute__((packed)) NodeBuffer {
|
||||
|
||||
void next() {
|
||||
oxTrace("ox::ptrarith::NodeBuffer::Iterator::next") << m_it++;
|
||||
m_current = m_buffer->next(m_current);
|
||||
if (hasNext()) {
|
||||
m_current = m_buffer->next(m_current);
|
||||
} else {
|
||||
m_current = nullptr;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -107,7 +115,7 @@ class __attribute__((packed)) NodeBuffer {
|
||||
|
||||
ItemPtr malloc(size_t size);
|
||||
|
||||
void free(ItemPtr item);
|
||||
Error free(ItemPtr item);
|
||||
|
||||
bool valid(size_t maxSize);
|
||||
|
||||
@@ -192,11 +200,10 @@ typename NodeBuffer<size_t, Item>::ItemPtr NodeBuffer<size_t, Item>::next(Item *
|
||||
template<typename size_t, typename Item>
|
||||
typename NodeBuffer<size_t, Item>::ItemPtr NodeBuffer<size_t, Item>::ptr(size_t itemOffset) {
|
||||
// make sure this can be read as an Item, and then use Item::size for the size
|
||||
auto itemSpace = m_header.size - itemOffset;
|
||||
std::size_t itemSpace = m_header.size - itemOffset;
|
||||
auto item = reinterpret_cast<Item*>(reinterpret_cast<uint8_t*>(this) + itemOffset);
|
||||
if (itemOffset >= sizeof(Header) &&
|
||||
itemOffset < m_header.size - sizeof(Item) &&
|
||||
itemSpace >= static_cast<size_t>(sizeof(Item)) &&
|
||||
itemSpace >= sizeof(Item) &&
|
||||
itemSpace >= item->fullSize()) {
|
||||
return ItemPtr(this, m_header.size, itemOffset, item->fullSize());
|
||||
} else {
|
||||
@@ -207,6 +214,7 @@ typename NodeBuffer<size_t, Item>::ItemPtr NodeBuffer<size_t, Item>::ptr(size_t
|
||||
|
||||
template<typename size_t, typename Item>
|
||||
typename NodeBuffer<size_t, Item>::ItemPtr NodeBuffer<size_t, Item>::malloc(size_t size) {
|
||||
oxTrace("ox::ptrarith::NodeBuffer::malloc") << "Size:" << size;
|
||||
size_t fullSize = size + sizeof(Item);
|
||||
if (m_header.size - m_header.bytesUsed >= fullSize) {
|
||||
auto last = lastItem();
|
||||
@@ -216,7 +224,7 @@ typename NodeBuffer<size_t, Item>::ItemPtr NodeBuffer<size_t, Item>::malloc(size
|
||||
} else {
|
||||
// there is no first item, so this may be the first item
|
||||
if (!m_header.firstItem) {
|
||||
oxTrace("ox::fs::NodeBuffer::malloc") << "No first item, initializing.";
|
||||
oxTrace("ox::ptrarith::NodeBuffer::malloc") << "No first item, initializing.";
|
||||
m_header.firstItem = sizeof(m_header);
|
||||
addr = m_header.firstItem;
|
||||
}
|
||||
@@ -231,7 +239,7 @@ typename NodeBuffer<size_t, Item>::ItemPtr NodeBuffer<size_t, Item>::malloc(size
|
||||
if (first.valid()) {
|
||||
first->prev = out.offset();
|
||||
} else {
|
||||
oxTrace("ox::fs::NodeBuffer::malloc::fail") << "NodeBuffer malloc failed due to invalid first element pointer.";
|
||||
oxTrace("ox::ptrarith::NodeBuffer::malloc::fail") << "NodeBuffer malloc failed due to invalid first element pointer.";
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -240,34 +248,37 @@ typename NodeBuffer<size_t, Item>::ItemPtr NodeBuffer<size_t, Item>::malloc(size
|
||||
if (last.valid()) {
|
||||
last->next = out.offset();
|
||||
} else {
|
||||
oxTrace("ox::fs::NodeBuffer::malloc::fail") << "NodeBuffer malloc failed due to invalid last element pointer.";
|
||||
oxTrace("ox::ptrarith::NodeBuffer::malloc::fail") << "NodeBuffer malloc failed due to invalid last element pointer.";
|
||||
return nullptr;
|
||||
}
|
||||
m_header.bytesUsed += out.size();
|
||||
} else {
|
||||
oxTrace("ox::fs::NodeBuffer::malloc::fail") << "Unknown";
|
||||
oxTrace("ox::ptrarith::NodeBuffer::malloc::fail") << "Unknown";
|
||||
}
|
||||
return out;
|
||||
}
|
||||
oxTrace("ox::fs::NodeBuffer::malloc::fail") << "Insufficient space:" << fullSize << "needed," << available() << "available";
|
||||
oxTrace("ox::ptrarith::NodeBuffer::malloc::fail") << "Insufficient space:" << fullSize << "needed," << available() << "available";
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
template<typename size_t, typename Item>
|
||||
void NodeBuffer<size_t, Item>::free(ItemPtr item) {
|
||||
Error NodeBuffer<size_t, Item>::free(ItemPtr item) {
|
||||
auto prev = this->prev(item);
|
||||
auto next = this->next(item);
|
||||
if (prev.valid()) {
|
||||
if (prev.valid() && next.valid()) {
|
||||
prev->next = next.offset();
|
||||
} else {
|
||||
oxTrace("ox::fs::NodeBuffer::free::fail") << "NodeBuffer free failed due to invalid prev element pointer.";
|
||||
}
|
||||
if (next.valid()) {
|
||||
next->prev = prev.offset();
|
||||
} else {
|
||||
oxTrace("ox::fs::NodeBuffer::free::fail") << "NodeBuffer free failed due to invalid next element pointer.";
|
||||
if (!prev.valid()) {
|
||||
oxTrace("ox::ptrarith::NodeBuffer::free::fail") << "NodeBuffer free failed due to invalid prev element pointer:" << prev.offset();
|
||||
}
|
||||
if (!next.valid()) {
|
||||
oxTrace("ox::ptrarith::NodeBuffer::free::fail") << "NodeBuffer free failed due to invalid next element pointer:" << next.offset();
|
||||
}
|
||||
return OxError(1);
|
||||
}
|
||||
m_header.bytesUsed -= item.size();
|
||||
return OxError(0);
|
||||
}
|
||||
|
||||
template<typename size_t, typename Item>
|
||||
|
8
deps/ox/src/ox/ptrarith/ptr.hpp
vendored
8
deps/ox/src/ox/ptrarith/ptr.hpp
vendored
@@ -29,7 +29,7 @@ class Ptr {
|
||||
|
||||
inline Ptr(std::nullptr_t);
|
||||
|
||||
inline Ptr(void *dataStart, size_t dataSize, size_t itemStart, size_t itemSize = sizeof(T));
|
||||
inline Ptr(void *dataStart, size_t dataSize, size_t itemStart, size_t itemSize = sizeof(T), size_t itemTypeSize = sizeof(T));
|
||||
|
||||
inline bool valid() const;
|
||||
|
||||
@@ -83,12 +83,12 @@ inline Ptr<T, size_t, minOffset>::Ptr(std::nullptr_t) {
|
||||
}
|
||||
|
||||
template<typename T, typename size_t, size_t minOffset>
|
||||
inline Ptr<T, size_t, minOffset>::Ptr(void *dataStart, size_t dataSize, size_t itemStart, size_t itemSize) {
|
||||
inline Ptr<T, size_t, minOffset>::Ptr(void *dataStart, size_t dataSize, size_t itemStart, size_t itemSize, size_t itemTypeSize) {
|
||||
// do some sanity checks before assuming this is valid
|
||||
if (itemSize >= sizeof(T) &&
|
||||
if (itemSize >= itemTypeSize &&
|
||||
dataStart &&
|
||||
itemStart >= minOffset &&
|
||||
static_cast<std::size_t>(itemStart + itemSize) <= dataSize) {
|
||||
itemStart + itemSize <= dataSize) {
|
||||
m_dataStart = reinterpret_cast<uint8_t*>(dataStart);
|
||||
m_dataSize = dataSize;
|
||||
m_itemOffset = itemStart;
|
||||
|
Reference in New Issue
Block a user