diff options
| author | Jordan Woyak <jordan.woyak@gmail.com> | 2025-11-19 17:32:33 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-19 17:32:33 -0600 |
| commit | 41b6ab40e157802e2d78435bbd90f1cb4f70e04e (patch) | |
| tree | 37e64d5e680881f1755b2acbbf6b9b4c30934246 | |
| parent | 2d7ebe46e3a5136ef891c137ca3b390cc3a19743 (diff) | |
| parent | f665eaad5fb038762fcf4de7b950362e23647aa2 (diff) | |
Merge pull request #13619 from y21/usbv5_getversion_size
Check buffer out/size in HID_USBv5/USB_VEN GetVersion Ioctl
| -rw-r--r-- | Source/Core/Core/IOS/USB/USBV5.cpp | 16 | ||||
| -rw-r--r-- | Source/Core/Core/IOS/USB/USBV5.h | 1 | ||||
| -rw-r--r-- | Source/Core/Core/IOS/USB/USB_HID/HIDv5.cpp | 8 | ||||
| -rw-r--r-- | Source/Core/Core/IOS/USB/USB_VEN/VEN.cpp | 8 |
4 files changed, 19 insertions, 14 deletions
diff --git a/Source/Core/Core/IOS/USB/USBV5.cpp b/Source/Core/Core/IOS/USB/USBV5.cpp index e43e59dfaf..afc29a252a 100644 --- a/Source/Core/Core/IOS/USB/USBV5.cpp +++ b/Source/Core/Core/IOS/USB/USBV5.cpp @@ -204,6 +204,22 @@ std::optional<IPCReply> USBV5ResourceManager::HandleDeviceIOCtl(const IOCtlReque return handler(*device); } +IPCReply USBV5ResourceManager::GetUSBVersion(const IOCtlRequest& request) const +{ + static constexpr u32 VERSION = 0x50001; + + if (request.buffer_in != 0 || request.buffer_in_size != 0 || request.buffer_out == 0 || + request.buffer_out_size != 0x20) + { + return IPCReply(IPC_EINVAL); + } + + auto& system = GetSystem(); + auto& memory = system.GetMemory(); + memory.Write_U32(VERSION, request.buffer_out); + return IPCReply(IPC_SUCCESS); +} + void USBV5ResourceManager::OnDeviceChange(const ChangeEvent event, std::shared_ptr<USB::Device> device) { diff --git a/Source/Core/Core/IOS/USB/USBV5.h b/Source/Core/Core/IOS/USB/USBV5.h index 8c722ff723..059092c1a9 100644 --- a/Source/Core/Core/IOS/USB/USBV5.h +++ b/Source/Core/Core/IOS/USB/USBV5.h @@ -83,6 +83,7 @@ protected: using Handler = std::function<std::optional<IPCReply>(USBV5Device&)>; std::optional<IPCReply> HandleDeviceIOCtl(const IOCtlRequest& request, Handler handler); + IPCReply GetUSBVersion(const IOCtlRequest& request) const; void OnDeviceChange(ChangeEvent event, std::shared_ptr<USB::Device> device) override; void OnDeviceChangeEnd() override; diff --git a/Source/Core/Core/IOS/USB/USB_HID/HIDv5.cpp b/Source/Core/Core/IOS/USB/USB_HID/HIDv5.cpp index ac4439d438..930fda33b7 100644 --- a/Source/Core/Core/IOS/USB/USB_HID/HIDv5.cpp +++ b/Source/Core/Core/IOS/USB/USB_HID/HIDv5.cpp @@ -16,21 +16,15 @@ namespace IOS::HLE { -constexpr u32 USBV5_VERSION = 0x50001; - USB_HIDv5::~USB_HIDv5() = default; std::optional<IPCReply> USB_HIDv5::IOCtl(const IOCtlRequest& request) { - auto& system = GetSystem(); - auto& memory = system.GetMemory(); - request.Log(GetDeviceName(), Common::Log::LogType::IOS_USB); switch (request.request) { case USB::IOCTL_USBV5_GETVERSION: - memory.Write_U32(USBV5_VERSION, request.buffer_out); - return IPCReply(IPC_SUCCESS); + return GetUSBVersion(request); case USB::IOCTL_USBV5_GETDEVICECHANGE: return GetDeviceChange(request); case USB::IOCTL_USBV5_SHUTDOWN: diff --git a/Source/Core/Core/IOS/USB/USB_VEN/VEN.cpp b/Source/Core/Core/IOS/USB/USB_VEN/VEN.cpp index 2217453840..fc97a93298 100644 --- a/Source/Core/Core/IOS/USB/USB_VEN/VEN.cpp +++ b/Source/Core/Core/IOS/USB/USB_VEN/VEN.cpp @@ -16,21 +16,15 @@ namespace IOS::HLE { -constexpr u32 USBV5_VERSION = 0x50001; - USB_VEN::~USB_VEN() = default; std::optional<IPCReply> USB_VEN::IOCtl(const IOCtlRequest& request) { - auto& system = GetSystem(); - auto& memory = system.GetMemory(); - request.Log(GetDeviceName(), Common::Log::LogType::IOS_USB); switch (request.request) { case USB::IOCTL_USBV5_GETVERSION: - memory.Write_U32(USBV5_VERSION, request.buffer_out); - return IPCReply(IPC_SUCCESS); + return GetUSBVersion(request); case USB::IOCTL_USBV5_GETDEVICECHANGE: return GetDeviceChange(request); case USB::IOCTL_USBV5_SHUTDOWN: |
