From 3eba0bd9d8d66726286a222f2ab801c30da143e4 Mon Sep 17 00:00:00 2001 From: Drew Galbraith Date: Fri, 1 Dec 2023 09:42:11 -0800 Subject: [PATCH] [Yunq] Check identify byte and ensure users check status code. --- lib/yunq/serialize.cpp | 14 +++++++---- lib/yunq/serialize.h | 3 ++- sys/denali/lib/denali/denali.yunq.client.cpp | 12 ++++++++-- sys/denali/lib/denali/denali.yunq.cpp | 6 ++--- sys/denali/lib/denali/denali.yunq.h | 12 +++++----- sys/denali/lib/denali/denali.yunq.server.cpp | 12 ++++++++-- .../victoriafalls.yunq.client.cpp | 12 ++++++++-- .../lib/victoriafalls/victoriafalls.yunq.cpp | 8 +++---- .../lib/victoriafalls/victoriafalls.yunq.h | 16 ++++++------- .../victoriafalls.yunq.server.cpp | 12 ++++++++-- .../lib/voyageurs/voyageurs.yunq.cpp | 2 +- sys/voyageurs/lib/voyageurs/voyageurs.yunq.h | 4 ++-- .../lib/voyageurs/voyageurs.yunq.server.cpp | 6 ++++- .../yellowstone/yellowstone.yunq.client.cpp | 24 +++++++++++++++---- .../lib/yellowstone/yellowstone.yunq.cpp | 12 +++++----- .../lib/yellowstone/yellowstone.yunq.h | 24 +++++++++---------- .../yellowstone/yellowstone.yunq.server.cpp | 12 ++++++++-- yunq/client.cpp.jinja | 6 ++++- yunq/message.cpp.jinja | 2 +- yunq/message.h.jinja | 4 ++-- yunq/server.cpp.jinja | 6 ++++- 21 files changed, 142 insertions(+), 67 deletions(-) diff --git a/lib/yunq/serialize.cpp b/lib/yunq/serialize.cpp index f8025a0..afaad06 100644 --- a/lib/yunq/serialize.cpp +++ b/lib/yunq/serialize.cpp @@ -1,9 +1,16 @@ #include "serialize.h" namespace yunq { +namespace { -glcr::Status CheckHeader(const glcr::ByteBuffer& buffer) { - // TODO: Check ident. +const uint64_t kIdentByte = 0x33441122; + +} // namespace + +glcr::Status CheckHeader(const glcr::ByteBuffer& buffer, uint64_t offset) { + if (buffer.At(offset + 0) != kIdentByte) { + return glcr::InvalidArgument("Trying to parse an invalid yunq message."); + } // TODO: Parse core size. // TODO: Parse extension size. // TODO: Check CRC32 @@ -13,8 +20,7 @@ glcr::Status CheckHeader(const glcr::ByteBuffer& buffer) { void WriteHeader(glcr::ByteBuffer& bytes, uint64_t offset, uint32_t core_size, uint32_t extension_size) { - bytes.WriteAt( - offset + 0, 0xDEADBEEF); // TODO: Chose a more unique ident sequence. + bytes.WriteAt(offset + 0, kIdentByte); bytes.WriteAt(offset + 4, core_size); bytes.WriteAt(offset + 8, extension_size); bytes.WriteAt(offset + 12, 0); // TODO: Calculate CRC32. diff --git a/lib/yunq/serialize.h b/lib/yunq/serialize.h index 3a2f229..2e90779 100644 --- a/lib/yunq/serialize.h +++ b/lib/yunq/serialize.h @@ -5,7 +5,8 @@ namespace yunq { -[[nodiscard]] glcr::Status CheckHeader(const glcr::ByteBuffer& buffer); +[[nodiscard]] glcr::Status CheckHeader(const glcr::ByteBuffer& buffer, + uint64_t offset); void WriteHeader(glcr::ByteBuffer& bytes, uint64_t offset, uint32_t core_size, uint32_t extension_size); diff --git a/sys/denali/lib/denali/denali.yunq.client.cpp b/sys/denali/lib/denali/denali.yunq.client.cpp index 60764dc..83ef3b6 100644 --- a/sys/denali/lib/denali/denali.yunq.client.cpp +++ b/sys/denali/lib/denali/denali.yunq.client.cpp @@ -48,7 +48,11 @@ glcr::ErrorCode DenaliClient::Read(const ReadRequest& request, ReadResponse& res RET_ERR(buffer_.At(8)); - response.ParseFromBytes(buffer_, 16, cap_buffer_); + // TODO: Return status. + auto status = response.ParseFromBytes(buffer_, 16, cap_buffer_); + if (!status) { + return status.code(); + } return glcr::OK; @@ -87,7 +91,11 @@ glcr::ErrorCode DenaliClient::ReadMany(const ReadManyRequest& request, ReadRespo RET_ERR(buffer_.At(8)); - response.ParseFromBytes(buffer_, 16, cap_buffer_); + // TODO: Return status. + auto status = response.ParseFromBytes(buffer_, 16, cap_buffer_); + if (!status) { + return status.code(); + } return glcr::OK; diff --git a/sys/denali/lib/denali/denali.yunq.cpp b/sys/denali/lib/denali/denali.yunq.cpp index c390abc..0f6646b 100644 --- a/sys/denali/lib/denali/denali.yunq.cpp +++ b/sys/denali/lib/denali/denali.yunq.cpp @@ -25,7 +25,7 @@ glcr::Status ReadRequest::ParseFromBytes(const glcr::ByteBuffer& bytes, uint64_t } glcr::Status ReadRequest::ParseFromBytesInternal(const glcr::ByteBuffer& bytes, uint64_t offset) { - RETURN_ERROR(yunq::CheckHeader(bytes)); + RETURN_ERROR(yunq::CheckHeader(bytes, offset)); // Parse device_id. set_device_id(bytes.At(offset + header_size + (8 * 0))); // Parse lba. @@ -79,7 +79,7 @@ glcr::Status ReadManyRequest::ParseFromBytes(const glcr::ByteBuffer& bytes, uint } glcr::Status ReadManyRequest::ParseFromBytesInternal(const glcr::ByteBuffer& bytes, uint64_t offset) { - RETURN_ERROR(yunq::CheckHeader(bytes)); + RETURN_ERROR(yunq::CheckHeader(bytes, offset)); // Parse device_id. set_device_id(bytes.At(offset + header_size + (8 * 0))); // Parse lba. @@ -200,7 +200,7 @@ glcr::Status ReadResponse::ParseFromBytes(const glcr::ByteBuffer& bytes, uint64_ } glcr::Status ReadResponse::ParseFromBytesInternal(const glcr::ByteBuffer& bytes, uint64_t offset) { - RETURN_ERROR(yunq::CheckHeader(bytes)); + RETURN_ERROR(yunq::CheckHeader(bytes, offset)); // Parse device_id. set_device_id(bytes.At(offset + header_size + (8 * 0))); // Parse size. diff --git a/sys/denali/lib/denali/denali.yunq.h b/sys/denali/lib/denali/denali.yunq.h index 71a4e9c..414c807 100644 --- a/sys/denali/lib/denali/denali.yunq.h +++ b/sys/denali/lib/denali/denali.yunq.h @@ -16,8 +16,8 @@ class ReadRequest { ReadRequest(const ReadRequest&) = delete; ReadRequest(ReadRequest&&) = delete; - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset) const; uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset, glcr::CapBuffer&) const; const uint64_t& device_id() const { return device_id_; } @@ -42,8 +42,8 @@ class ReadManyRequest { ReadManyRequest(const ReadManyRequest&) = delete; ReadManyRequest(ReadManyRequest&&) = delete; - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset) const; uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset, glcr::CapBuffer&) const; const uint64_t& device_id() const { return device_id_; } @@ -68,8 +68,8 @@ class ReadResponse { ReadResponse(const ReadResponse&) = delete; ReadResponse(ReadResponse&&) = delete; - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset) const; uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset, glcr::CapBuffer&) const; const uint64_t& device_id() const { return device_id_; } diff --git a/sys/denali/lib/denali/denali.yunq.server.cpp b/sys/denali/lib/denali/denali.yunq.server.cpp index 6d596ad..88c9fa1 100644 --- a/sys/denali/lib/denali/denali.yunq.server.cpp +++ b/sys/denali/lib/denali/denali.yunq.server.cpp @@ -103,7 +103,11 @@ glcr::ErrorCode DenaliServerBase::HandleRequest(const glcr::ByteBuffer& request, ReadRequest yunq_request; - yunq_request.ParseFromBytes(request, kHeaderSize, req_caps); + // TODO: Return status. + auto status = yunq_request.ParseFromBytes(request, kHeaderSize, req_caps); + if (!status) { + return status.code(); + } @@ -123,7 +127,11 @@ glcr::ErrorCode DenaliServerBase::HandleRequest(const glcr::ByteBuffer& request, ReadManyRequest yunq_request; - yunq_request.ParseFromBytes(request, kHeaderSize, req_caps); + // TODO: Return status. + auto status = yunq_request.ParseFromBytes(request, kHeaderSize, req_caps); + if (!status) { + return status.code(); + } diff --git a/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.client.cpp b/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.client.cpp index cf03ab0..59717dd 100644 --- a/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.client.cpp +++ b/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.client.cpp @@ -48,7 +48,11 @@ glcr::ErrorCode VFSClient::OpenFile(const OpenFileRequest& request, OpenFileResp RET_ERR(buffer_.At(8)); - response.ParseFromBytes(buffer_, 16, cap_buffer_); + // TODO: Return status. + auto status = response.ParseFromBytes(buffer_, 16, cap_buffer_); + if (!status) { + return status.code(); + } return glcr::OK; @@ -87,7 +91,11 @@ glcr::ErrorCode VFSClient::GetDirectory(const GetDirectoryRequest& request, Dire RET_ERR(buffer_.At(8)); - response.ParseFromBytes(buffer_, 16, cap_buffer_); + // TODO: Return status. + auto status = response.ParseFromBytes(buffer_, 16, cap_buffer_); + if (!status) { + return status.code(); + } return glcr::OK; diff --git a/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.cpp b/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.cpp index 56249a4..44c50b0 100644 --- a/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.cpp +++ b/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.cpp @@ -25,7 +25,7 @@ glcr::Status OpenFileRequest::ParseFromBytes(const glcr::ByteBuffer& bytes, uint } glcr::Status OpenFileRequest::ParseFromBytesInternal(const glcr::ByteBuffer& bytes, uint64_t offset) { - RETURN_ERROR(yunq::CheckHeader(bytes)); + RETURN_ERROR(yunq::CheckHeader(bytes, offset)); // Parse path. auto path_pointer = bytes.At(offset + header_size + (8 * 0)); @@ -94,7 +94,7 @@ glcr::Status OpenFileResponse::ParseFromBytes(const glcr::ByteBuffer& bytes, uin } glcr::Status OpenFileResponse::ParseFromBytesInternal(const glcr::ByteBuffer& bytes, uint64_t offset) { - RETURN_ERROR(yunq::CheckHeader(bytes)); + RETURN_ERROR(yunq::CheckHeader(bytes, offset)); // Parse path. auto path_pointer = bytes.At(offset + header_size + (8 * 0)); @@ -170,7 +170,7 @@ glcr::Status GetDirectoryRequest::ParseFromBytes(const glcr::ByteBuffer& bytes, } glcr::Status GetDirectoryRequest::ParseFromBytesInternal(const glcr::ByteBuffer& bytes, uint64_t offset) { - RETURN_ERROR(yunq::CheckHeader(bytes)); + RETURN_ERROR(yunq::CheckHeader(bytes, offset)); // Parse path. auto path_pointer = bytes.At(offset + header_size + (8 * 0)); @@ -232,7 +232,7 @@ glcr::Status Directory::ParseFromBytes(const glcr::ByteBuffer& bytes, uint64_t o } glcr::Status Directory::ParseFromBytesInternal(const glcr::ByteBuffer& bytes, uint64_t offset) { - RETURN_ERROR(yunq::CheckHeader(bytes)); + RETURN_ERROR(yunq::CheckHeader(bytes, offset)); // Parse filenames. auto filenames_pointer = bytes.At(offset + header_size + (8 * 0)); diff --git a/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.h b/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.h index 9c51ebd..7549408 100644 --- a/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.h +++ b/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.h @@ -16,8 +16,8 @@ class OpenFileRequest { OpenFileRequest(const OpenFileRequest&) = delete; OpenFileRequest(OpenFileRequest&&) = delete; - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset) const; uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset, glcr::CapBuffer&) const; const glcr::String& path() const { return path_; } @@ -36,8 +36,8 @@ class OpenFileResponse { OpenFileResponse(const OpenFileResponse&) = delete; OpenFileResponse(OpenFileResponse&&) = delete; - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset) const; uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset, glcr::CapBuffer&) const; const glcr::String& path() const { return path_; } @@ -62,8 +62,8 @@ class GetDirectoryRequest { GetDirectoryRequest(const GetDirectoryRequest&) = delete; GetDirectoryRequest(GetDirectoryRequest&&) = delete; - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset) const; uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset, glcr::CapBuffer&) const; const glcr::String& path() const { return path_; } @@ -82,8 +82,8 @@ class Directory { Directory(const Directory&) = delete; Directory(Directory&&) = delete; - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset) const; uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset, glcr::CapBuffer&) const; const glcr::String& filenames() const { return filenames_; } diff --git a/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.server.cpp b/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.server.cpp index 8a0b757..a948032 100644 --- a/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.server.cpp +++ b/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.server.cpp @@ -103,7 +103,11 @@ glcr::ErrorCode VFSServerBase::HandleRequest(const glcr::ByteBuffer& request, OpenFileRequest yunq_request; - yunq_request.ParseFromBytes(request, kHeaderSize, req_caps); + // TODO: Return status. + auto status = yunq_request.ParseFromBytes(request, kHeaderSize, req_caps); + if (!status) { + return status.code(); + } @@ -123,7 +127,11 @@ glcr::ErrorCode VFSServerBase::HandleRequest(const glcr::ByteBuffer& request, GetDirectoryRequest yunq_request; - yunq_request.ParseFromBytes(request, kHeaderSize, req_caps); + // TODO: Return status. + auto status = yunq_request.ParseFromBytes(request, kHeaderSize, req_caps); + if (!status) { + return status.code(); + } diff --git a/sys/voyageurs/lib/voyageurs/voyageurs.yunq.cpp b/sys/voyageurs/lib/voyageurs/voyageurs.yunq.cpp index 7a9607a..3adfc57 100644 --- a/sys/voyageurs/lib/voyageurs/voyageurs.yunq.cpp +++ b/sys/voyageurs/lib/voyageurs/voyageurs.yunq.cpp @@ -32,7 +32,7 @@ glcr::Status KeyboardListener::ParseFromBytes(const glcr::ByteBuffer& bytes, uin } glcr::Status KeyboardListener::ParseFromBytesInternal(const glcr::ByteBuffer& bytes, uint64_t offset) { - RETURN_ERROR(yunq::CheckHeader(bytes)); + RETURN_ERROR(yunq::CheckHeader(bytes, offset)); // Parse port_capability. // Skip Cap. diff --git a/sys/voyageurs/lib/voyageurs/voyageurs.yunq.h b/sys/voyageurs/lib/voyageurs/voyageurs.yunq.h index 40d044d..da5c585 100644 --- a/sys/voyageurs/lib/voyageurs/voyageurs.yunq.h +++ b/sys/voyageurs/lib/voyageurs/voyageurs.yunq.h @@ -16,8 +16,8 @@ class KeyboardListener { KeyboardListener(const KeyboardListener&) = delete; KeyboardListener(KeyboardListener&&) = delete; - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset) const; uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset, glcr::CapBuffer&) const; const z_cap_t& port_capability() const { return port_capability_; } diff --git a/sys/voyageurs/lib/voyageurs/voyageurs.yunq.server.cpp b/sys/voyageurs/lib/voyageurs/voyageurs.yunq.server.cpp index 02c163f..b442937 100644 --- a/sys/voyageurs/lib/voyageurs/voyageurs.yunq.server.cpp +++ b/sys/voyageurs/lib/voyageurs/voyageurs.yunq.server.cpp @@ -103,7 +103,11 @@ glcr::ErrorCode VoyageursServerBase::HandleRequest(const glcr::ByteBuffer& reque KeyboardListener yunq_request; - yunq_request.ParseFromBytes(request, kHeaderSize, req_caps); + // TODO: Return status. + auto status = yunq_request.ParseFromBytes(request, kHeaderSize, req_caps); + if (!status) { + return status.code(); + } diff --git a/sys/yellowstone/lib/yellowstone/yellowstone.yunq.client.cpp b/sys/yellowstone/lib/yellowstone/yellowstone.yunq.client.cpp index be8623c..8cd6ede 100644 --- a/sys/yellowstone/lib/yellowstone/yellowstone.yunq.client.cpp +++ b/sys/yellowstone/lib/yellowstone/yellowstone.yunq.client.cpp @@ -87,7 +87,11 @@ glcr::ErrorCode YellowstoneClient::GetEndpoint(const GetEndpointRequest& request RET_ERR(buffer_.At(8)); - response.ParseFromBytes(buffer_, 16, cap_buffer_); + // TODO: Return status. + auto status = response.ParseFromBytes(buffer_, 16, cap_buffer_); + if (!status) { + return status.code(); + } return glcr::OK; @@ -126,7 +130,11 @@ glcr::ErrorCode YellowstoneClient::GetAhciInfo(AhciInfo& response) { RET_ERR(buffer_.At(8)); - response.ParseFromBytes(buffer_, 16, cap_buffer_); + // TODO: Return status. + auto status = response.ParseFromBytes(buffer_, 16, cap_buffer_); + if (!status) { + return status.code(); + } return glcr::OK; @@ -165,7 +173,11 @@ glcr::ErrorCode YellowstoneClient::GetFramebufferInfo(FramebufferInfo& response) RET_ERR(buffer_.At(8)); - response.ParseFromBytes(buffer_, 16, cap_buffer_); + // TODO: Return status. + auto status = response.ParseFromBytes(buffer_, 16, cap_buffer_); + if (!status) { + return status.code(); + } return glcr::OK; @@ -204,7 +216,11 @@ glcr::ErrorCode YellowstoneClient::GetDenali(DenaliInfo& response) { RET_ERR(buffer_.At(8)); - response.ParseFromBytes(buffer_, 16, cap_buffer_); + // TODO: Return status. + auto status = response.ParseFromBytes(buffer_, 16, cap_buffer_); + if (!status) { + return status.code(); + } return glcr::OK; diff --git a/sys/yellowstone/lib/yellowstone/yellowstone.yunq.cpp b/sys/yellowstone/lib/yellowstone/yellowstone.yunq.cpp index a498c96..6b78856 100644 --- a/sys/yellowstone/lib/yellowstone/yellowstone.yunq.cpp +++ b/sys/yellowstone/lib/yellowstone/yellowstone.yunq.cpp @@ -34,7 +34,7 @@ glcr::Status RegisterEndpointRequest::ParseFromBytes(const glcr::ByteBuffer& byt } glcr::Status RegisterEndpointRequest::ParseFromBytesInternal(const glcr::ByteBuffer& bytes, uint64_t offset) { - RETURN_ERROR(yunq::CheckHeader(bytes)); + RETURN_ERROR(yunq::CheckHeader(bytes, offset)); // Parse endpoint_name. auto endpoint_name_pointer = bytes.At(offset + header_size + (8 * 0)); @@ -104,7 +104,7 @@ glcr::Status GetEndpointRequest::ParseFromBytes(const glcr::ByteBuffer& bytes, u } glcr::Status GetEndpointRequest::ParseFromBytesInternal(const glcr::ByteBuffer& bytes, uint64_t offset) { - RETURN_ERROR(yunq::CheckHeader(bytes)); + RETURN_ERROR(yunq::CheckHeader(bytes, offset)); // Parse endpoint_name. auto endpoint_name_pointer = bytes.At(offset + header_size + (8 * 0)); @@ -173,7 +173,7 @@ glcr::Status Endpoint::ParseFromBytes(const glcr::ByteBuffer& bytes, uint64_t of } glcr::Status Endpoint::ParseFromBytesInternal(const glcr::ByteBuffer& bytes, uint64_t offset) { - RETURN_ERROR(yunq::CheckHeader(bytes)); + RETURN_ERROR(yunq::CheckHeader(bytes, offset)); // Parse endpoint. // Skip Cap. @@ -224,7 +224,7 @@ glcr::Status AhciInfo::ParseFromBytes(const glcr::ByteBuffer& bytes, uint64_t of } glcr::Status AhciInfo::ParseFromBytesInternal(const glcr::ByteBuffer& bytes, uint64_t offset) { - RETURN_ERROR(yunq::CheckHeader(bytes)); + RETURN_ERROR(yunq::CheckHeader(bytes, offset)); // Parse ahci_region. // Skip Cap. // Parse region_length. @@ -274,7 +274,7 @@ glcr::Status FramebufferInfo::ParseFromBytes(const glcr::ByteBuffer& bytes, uint } glcr::Status FramebufferInfo::ParseFromBytesInternal(const glcr::ByteBuffer& bytes, uint64_t offset) { - RETURN_ERROR(yunq::CheckHeader(bytes)); + RETURN_ERROR(yunq::CheckHeader(bytes, offset)); // Parse address_phys. set_address_phys(bytes.At(offset + header_size + (8 * 0))); // Parse width. @@ -389,7 +389,7 @@ glcr::Status DenaliInfo::ParseFromBytes(const glcr::ByteBuffer& bytes, uint64_t } glcr::Status DenaliInfo::ParseFromBytesInternal(const glcr::ByteBuffer& bytes, uint64_t offset) { - RETURN_ERROR(yunq::CheckHeader(bytes)); + RETURN_ERROR(yunq::CheckHeader(bytes, offset)); // Parse denali_endpoint. // Skip Cap. // Parse device_id. diff --git a/sys/yellowstone/lib/yellowstone/yellowstone.yunq.h b/sys/yellowstone/lib/yellowstone/yellowstone.yunq.h index 7046a7f..3fb2f88 100644 --- a/sys/yellowstone/lib/yellowstone/yellowstone.yunq.h +++ b/sys/yellowstone/lib/yellowstone/yellowstone.yunq.h @@ -18,8 +18,8 @@ class RegisterEndpointRequest { RegisterEndpointRequest(const RegisterEndpointRequest&) = delete; RegisterEndpointRequest(RegisterEndpointRequest&&) = delete; - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset) const; uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset, glcr::CapBuffer&) const; const glcr::String& endpoint_name() const { return endpoint_name_; } @@ -41,8 +41,8 @@ class GetEndpointRequest { GetEndpointRequest(const GetEndpointRequest&) = delete; GetEndpointRequest(GetEndpointRequest&&) = delete; - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset) const; uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset, glcr::CapBuffer&) const; const glcr::String& endpoint_name() const { return endpoint_name_; } @@ -61,8 +61,8 @@ class Endpoint { Endpoint(const Endpoint&) = delete; Endpoint(Endpoint&&) = delete; - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset) const; uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset, glcr::CapBuffer&) const; const z_cap_t& endpoint() const { return endpoint_; } @@ -81,8 +81,8 @@ class AhciInfo { AhciInfo(const AhciInfo&) = delete; AhciInfo(AhciInfo&&) = delete; - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset) const; uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset, glcr::CapBuffer&) const; const z_cap_t& ahci_region() const { return ahci_region_; } @@ -104,8 +104,8 @@ class FramebufferInfo { FramebufferInfo(const FramebufferInfo&) = delete; FramebufferInfo(FramebufferInfo&&) = delete; - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset) const; uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset, glcr::CapBuffer&) const; const uint64_t& address_phys() const { return address_phys_; } @@ -157,8 +157,8 @@ class DenaliInfo { DenaliInfo(const DenaliInfo&) = delete; DenaliInfo(DenaliInfo&&) = delete; - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset) const; uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset, glcr::CapBuffer&) const; const z_cap_t& denali_endpoint() const { return denali_endpoint_; } diff --git a/sys/yellowstone/lib/yellowstone/yellowstone.yunq.server.cpp b/sys/yellowstone/lib/yellowstone/yellowstone.yunq.server.cpp index 081fd1a..be4a716 100644 --- a/sys/yellowstone/lib/yellowstone/yellowstone.yunq.server.cpp +++ b/sys/yellowstone/lib/yellowstone/yellowstone.yunq.server.cpp @@ -105,7 +105,11 @@ glcr::ErrorCode YellowstoneServerBase::HandleRequest(const glcr::ByteBuffer& req RegisterEndpointRequest yunq_request; - yunq_request.ParseFromBytes(request, kHeaderSize, req_caps); + // TODO: Return status. + auto status = yunq_request.ParseFromBytes(request, kHeaderSize, req_caps); + if (!status) { + return status.code(); + } @@ -123,7 +127,11 @@ glcr::ErrorCode YellowstoneServerBase::HandleRequest(const glcr::ByteBuffer& req GetEndpointRequest yunq_request; - yunq_request.ParseFromBytes(request, kHeaderSize, req_caps); + // TODO: Return status. + auto status = yunq_request.ParseFromBytes(request, kHeaderSize, req_caps); + if (!status) { + return status.code(); + } diff --git a/yunq/client.cpp.jinja b/yunq/client.cpp.jinja index 6c61795..60bdf68 100644 --- a/yunq/client.cpp.jinja +++ b/yunq/client.cpp.jinja @@ -56,7 +56,11 @@ glcr::ErrorCode {{interface.name}}Client::{{method.name}}(const {{method.request RET_ERR(buffer_.At(8)); {% if method.response != None %} - response.ParseFromBytes(buffer_, 16, cap_buffer_); + // TODO: Return status. + auto status = response.ParseFromBytes(buffer_, 16, cap_buffer_); + if (!status) { + return status.code(); + } {% endif %} return glcr::OK; diff --git a/yunq/message.cpp.jinja b/yunq/message.cpp.jinja index 47e0c78..30f5556 100644 --- a/yunq/message.cpp.jinja +++ b/yunq/message.cpp.jinja @@ -46,7 +46,7 @@ glcr::Status {{message.name}}::ParseFromBytes(const glcr::ByteBuffer& bytes, uin } glcr::Status {{message.name}}::ParseFromBytesInternal(const glcr::ByteBuffer& bytes, uint64_t offset) { - RETURN_ERROR(yunq::CheckHeader(bytes)); + RETURN_ERROR(yunq::CheckHeader(bytes, offset)); {%- for field in message.fields %} // Parse {{field.name}}. diff --git a/yunq/message.h.jinja b/yunq/message.h.jinja index 69eb8b3..cf15b59 100644 --- a/yunq/message.h.jinja +++ b/yunq/message.h.jinja @@ -20,8 +20,8 @@ class {{message.name}} { {{message.name}}(const {{message.name}}&) = delete; {{message.name}}({{message.name}}&&) = delete; - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); - glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset); + [[nodiscard]] glcr::Status ParseFromBytes(const glcr::ByteBuffer&, uint64_t offset, const glcr::CapBuffer&); uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset) const; uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset, glcr::CapBuffer&) const; diff --git a/yunq/server.cpp.jinja b/yunq/server.cpp.jinja index c699829..c964065 100644 --- a/yunq/server.cpp.jinja +++ b/yunq/server.cpp.jinja @@ -106,7 +106,11 @@ glcr::ErrorCode {{interface.name}}ServerBase::HandleRequest(const glcr::ByteBuff {% if method.request != None %} {{method.request}} yunq_request; - yunq_request.ParseFromBytes(request, kHeaderSize, req_caps); + // TODO: Return status. + auto status = yunq_request.ParseFromBytes(request, kHeaderSize, req_caps); + if (!status) { + return status.code(); + } {% endif %} {% if method.response != None %}