aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2026-02-24 22:24:11 +0100
committerGitHub Enterprise <[email protected]>2026-02-24 22:24:11 +0100
commitfb19c8a86e89762ea89df3b361494a055680b432 (patch)
tree65f717270e3b52527c9c34aaeab864aec4b214f2 /src
parentupdated CLAUDE.md (diff)
downloadzen-fb19c8a86e89762ea89df3b361494a055680b432.tar.xz
zen-fb19c8a86e89762ea89df3b361494a055680b432.zip
Fix zencore bugs and propagate content type through IoBufferBuilder (#783)
- Add missing includes in hashutils.h (`<cstddef>`, `<type_traits>`) - Add `ZenContentType` parameter to all `IoBufferBuilder` factory methods so content type is set at buffer creation time - Fix null dereference in `SharedBuffer::GetFileReference()` when buffer is null - Fix out-of-bounds read in trace command-line argument parsing when arg length exactly matches option length - Add unit tests for 32-bit `CountLeadingZeros`
Diffstat (limited to 'src')
-rw-r--r--src/zencore/include/zencore/hashutils.h3
-rw-r--r--src/zencore/include/zencore/iobuffer.h37
-rw-r--r--src/zencore/include/zencore/sharedbuffer.h13
-rw-r--r--src/zencore/intmath.cpp6
-rw-r--r--src/zencore/iobuffer.cpp20
-rw-r--r--src/zencore/trace.cpp13
6 files changed, 65 insertions, 27 deletions
diff --git a/src/zencore/include/zencore/hashutils.h b/src/zencore/include/zencore/hashutils.h
index 4e877e219..6b9902b3a 100644
--- a/src/zencore/include/zencore/hashutils.h
+++ b/src/zencore/include/zencore/hashutils.h
@@ -2,6 +2,9 @@
#pragma once
+#include <cstddef>
+#include <type_traits>
+
namespace zen {
template<typename T>
diff --git a/src/zencore/include/zencore/iobuffer.h b/src/zencore/include/zencore/iobuffer.h
index 182768ff6..82c201edd 100644
--- a/src/zencore/include/zencore/iobuffer.h
+++ b/src/zencore/include/zencore/iobuffer.h
@@ -426,22 +426,39 @@ private:
class IoBufferBuilder
{
public:
- static IoBuffer MakeFromFile(const std::filesystem::path& FileName, uint64_t Offset = 0, uint64_t Size = ~0ull);
- static IoBuffer MakeFromTemporaryFile(const std::filesystem::path& FileName);
- static IoBuffer MakeFromFileHandle(void* FileHandle, uint64_t Offset = 0, uint64_t Size = ~0ull);
- /** Make sure buffer data is memory resident, but avoid memory mapping data from files
- */
- static IoBuffer ReadFromFileMaybe(const IoBuffer& InBuffer);
- inline static IoBuffer MakeFromMemory(MemoryView Memory) { return IoBuffer(IoBuffer::Wrap, Memory.GetData(), Memory.GetSize()); }
- inline static IoBuffer MakeCloneFromMemory(const void* Ptr, size_t Sz)
+ static IoBuffer MakeFromFile(const std::filesystem::path& FileName,
+ uint64_t Offset = 0,
+ uint64_t Size = ~0ull,
+ ZenContentType ContentType = ZenContentType::kBinary);
+ static IoBuffer MakeFromTemporaryFile(const std::filesystem::path& FileName, ZenContentType ContentType = ZenContentType::kBinary);
+ static IoBuffer MakeFromFileHandle(void* FileHandle,
+ uint64_t Offset = 0,
+ uint64_t Size = ~0ull,
+ ZenContentType ContentType = ZenContentType::kBinary);
+ inline static IoBuffer MakeFromMemory(MemoryView Memory, ZenContentType ContentType = ZenContentType::kBinary)
+ {
+ IoBuffer NewBuffer(IoBuffer::Wrap, Memory.GetData(), Memory.GetSize());
+ NewBuffer.SetContentType(ContentType);
+ return NewBuffer;
+ }
+ inline static IoBuffer MakeCloneFromMemory(const void* Ptr, size_t Sz, ZenContentType ContentType = ZenContentType::kBinary)
{
if (Sz)
{
- return IoBuffer(IoBuffer::Clone, Ptr, Sz);
+ IoBuffer NewBuffer(IoBuffer::Clone, Ptr, Sz);
+ NewBuffer.SetContentType(ContentType);
+ return NewBuffer;
}
return {};
}
- inline static IoBuffer MakeCloneFromMemory(MemoryView Memory) { return MakeCloneFromMemory(Memory.GetData(), Memory.GetSize()); }
+ inline static IoBuffer MakeCloneFromMemory(MemoryView Memory, ZenContentType ContentType = ZenContentType::kBinary)
+ {
+ return MakeCloneFromMemory(Memory.GetData(), Memory.GetSize(), ContentType);
+ }
+
+ /** Make sure buffer data is memory resident, but avoid memory mapping data from files
+ */
+ static IoBuffer ReadFromFileMaybe(const IoBuffer& InBuffer);
};
void iobuffer_forcelink();
diff --git a/src/zencore/include/zencore/sharedbuffer.h b/src/zencore/include/zencore/sharedbuffer.h
index c57e9f568..3d4c19282 100644
--- a/src/zencore/include/zencore/sharedbuffer.h
+++ b/src/zencore/include/zencore/sharedbuffer.h
@@ -116,14 +116,15 @@ public:
inline void Reset() { m_Buffer = nullptr; }
inline bool GetFileReference(IoBufferFileReference& OutRef) const
{
- if (const IoBufferExtendedCore* Core = m_Buffer->ExtendedCore())
+ if (!IsNull())
{
- return Core->GetFileReference(OutRef);
- }
- else
- {
- return false;
+ if (const IoBufferExtendedCore* Core = m_Buffer->ExtendedCore())
+ {
+ return Core->GetFileReference(OutRef);
+ }
}
+
+ return false;
}
[[nodiscard]] MemoryView GetView() const
diff --git a/src/zencore/intmath.cpp b/src/zencore/intmath.cpp
index 5a686dc8e..32f82b486 100644
--- a/src/zencore/intmath.cpp
+++ b/src/zencore/intmath.cpp
@@ -43,6 +43,12 @@ TEST_CASE("intmath")
CHECK(FloorLog2_64(0x0000'0001'0000'0000ull) == 32);
CHECK(FloorLog2_64(0x8000'0000'0000'0000ull) == 63);
+ CHECK(CountLeadingZeros(0x8000'0000u) == 0);
+ CHECK(CountLeadingZeros(0x0000'0000u) == 32);
+ CHECK(CountLeadingZeros(0x0000'0001u) == 31);
+ CHECK(CountLeadingZeros(0x0000'8000u) == 16);
+ CHECK(CountLeadingZeros(0x0001'0000u) == 15);
+
CHECK(CountLeadingZeros64(0x8000'0000'0000'0000ull) == 0);
CHECK(CountLeadingZeros64(0x0000'0000'0000'0000ull) == 64);
CHECK(CountLeadingZeros64(0x0000'0000'0000'0001ull) == 63);
diff --git a/src/zencore/iobuffer.cpp b/src/zencore/iobuffer.cpp
index be9b39e7a..1c31d6620 100644
--- a/src/zencore/iobuffer.cpp
+++ b/src/zencore/iobuffer.cpp
@@ -592,15 +592,17 @@ IoBufferBuilder::ReadFromFileMaybe(const IoBuffer& InBuffer)
}
IoBuffer
-IoBufferBuilder::MakeFromFileHandle(void* FileHandle, uint64_t Offset, uint64_t Size)
+IoBufferBuilder::MakeFromFileHandle(void* FileHandle, uint64_t Offset, uint64_t Size, ZenContentType ContentType)
{
ZEN_TRACE_CPU("IoBufferBuilder::MakeFromFileHandle");
- return IoBuffer(IoBuffer::BorrowedFile, FileHandle, Offset, Size);
+ IoBuffer Buffer(IoBuffer::BorrowedFile, FileHandle, Offset, Size);
+ Buffer.SetContentType(ContentType);
+ return Buffer;
}
IoBuffer
-IoBufferBuilder::MakeFromFile(const std::filesystem::path& FileName, uint64_t Offset, uint64_t Size)
+IoBufferBuilder::MakeFromFile(const std::filesystem::path& FileName, uint64_t Offset, uint64_t Size, ZenContentType ContentType)
{
ZEN_TRACE_CPU("IoBufferBuilder::MakeFromFile");
@@ -632,8 +634,6 @@ IoBufferBuilder::MakeFromFile(const std::filesystem::path& FileName, uint64_t Of
FileSize = Stat.st_size;
#endif // ZEN_PLATFORM_WINDOWS
- // TODO: should validate that offset is in range
-
if (Size == ~0ull)
{
Size = FileSize - Offset;
@@ -652,7 +652,9 @@ IoBufferBuilder::MakeFromFile(const std::filesystem::path& FileName, uint64_t Of
#if ZEN_PLATFORM_WINDOWS
void* Fd = DataFile.Detach();
#endif
- return IoBuffer(IoBuffer::File, (void*)uintptr_t(Fd), Offset, Size, Offset == 0 && Size == FileSize);
+ IoBuffer NewBuffer(IoBuffer::File, (void*)uintptr_t(Fd), Offset, Size, Offset == 0 && Size == FileSize);
+ NewBuffer.SetContentType(ContentType);
+ return NewBuffer;
}
#if !ZEN_PLATFORM_WINDOWS
@@ -664,7 +666,7 @@ IoBufferBuilder::MakeFromFile(const std::filesystem::path& FileName, uint64_t Of
}
IoBuffer
-IoBufferBuilder::MakeFromTemporaryFile(const std::filesystem::path& FileName)
+IoBufferBuilder::MakeFromTemporaryFile(const std::filesystem::path& FileName, ZenContentType ContentType)
{
ZEN_TRACE_CPU("IoBufferBuilder::MakeFromTemporaryFile");
@@ -703,7 +705,9 @@ IoBufferBuilder::MakeFromTemporaryFile(const std::filesystem::path& FileName)
Handle = (void*)uintptr_t(Fd);
#endif // ZEN_PLATFORM_WINDOWS
- return IoBuffer(IoBuffer::File, Handle, 0, FileSize, /*IsWholeFile*/ true);
+ IoBuffer NewBuffer(IoBuffer::File, Handle, 0, FileSize, /*IsWholeFile*/ true);
+ NewBuffer.SetContentType(ContentType);
+ return NewBuffer;
}
//////////////////////////////////////////////////////////////////////////
diff --git a/src/zencore/trace.cpp b/src/zencore/trace.cpp
index 87035554f..a026974c0 100644
--- a/src/zencore/trace.cpp
+++ b/src/zencore/trace.cpp
@@ -165,10 +165,17 @@ GetTraceOptionsFromCommandline(TraceOptions& OutOptions)
auto MatchesArg = [](std::string_view Option, std::string_view Arg) -> std::optional<std::string_view> {
if (Arg.starts_with(Option))
{
- std::string_view::value_type DelimChar = Arg[Option.length()];
- if (DelimChar == ' ' || DelimChar == '=')
+ if (Arg.length() > Option.length())
{
- return Arg.substr(Option.size() + 1);
+ std::string_view::value_type DelimChar = Arg[Option.length()];
+ if (DelimChar == ' ' || DelimChar == '=')
+ {
+ return Arg.substr(Option.size() + 1);
+ }
+ }
+ else
+ {
+ return ""sv;
}
}
return {};