summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Woyak <jordan.woyak@gmail.com>2025-11-19 17:32:33 -0600
committerGitHub <noreply@github.com>2025-11-19 17:32:33 -0600
commit41b6ab40e157802e2d78435bbd90f1cb4f70e04e (patch)
tree37e64d5e680881f1755b2acbbf6b9b4c30934246
parent2d7ebe46e3a5136ef891c137ca3b390cc3a19743 (diff)
parentf665eaad5fb038762fcf4de7b950362e23647aa2 (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.cpp16
-rw-r--r--Source/Core/Core/IOS/USB/USBV5.h1
-rw-r--r--Source/Core/Core/IOS/USB/USB_HID/HIDv5.cpp8
-rw-r--r--Source/Core/Core/IOS/USB/USB_VEN/VEN.cpp8
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: