diff options
| author | 2023-02-08 10:09:26 -0500 | |
|---|---|---|
| committer | 2023-02-08 10:09:26 -0500 | |
| commit | f6477b91f9abe4ad4b4101f9f80ddb3412462a5d (patch) | |
| tree | f7fcacd7425bc75629ae8dffc7df708d54d4adb0 /src | |
| parent | Merge pull request #9739 from liamwhite/old-gcc-fix (diff) | |
| parent | service: hid: Return error if arguments of SetSupportedNpadIdType is invalid (diff) | |
| download | yuzu-f6477b91f9abe4ad4b4101f9f80ddb3412462a5d.tar.gz yuzu-f6477b91f9abe4ad4b4101f9f80ddb3412462a5d.tar.xz yuzu-f6477b91f9abe4ad4b4101f9f80ddb3412462a5d.zip | |
Merge pull request #9747 from german77/SetSupportedNpadIdTypes
service: hid: Return error if arguments of SetSupportedNpadIdType is invalid
Diffstat (limited to '')
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.cpp | 12 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.h | 2 | ||||
| -rw-r--r-- | src/core/hle/service/hid/errors.h | 1 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 6 |
4 files changed, 15 insertions, 6 deletions
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index 513ea485a..80eba22e8 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp | |||
| @@ -758,12 +758,20 @@ Core::HID::NpadStyleTag Controller_NPad::GetSupportedStyleSet() const { | |||
| 758 | return hid_core.GetSupportedStyleTag(); | 758 | return hid_core.GetSupportedStyleTag(); |
| 759 | } | 759 | } |
| 760 | 760 | ||
| 761 | void Controller_NPad::SetSupportedNpadIdTypes(std::span<const u8> data) { | 761 | Result Controller_NPad::SetSupportedNpadIdTypes(std::span<const u8> data) { |
| 762 | constexpr std::size_t max_number_npad_ids = 0xa; | ||
| 762 | const auto length = data.size(); | 763 | const auto length = data.size(); |
| 763 | ASSERT(length > 0 && (length % sizeof(u32)) == 0); | 764 | ASSERT(length > 0 && (length % sizeof(u32)) == 0); |
| 765 | const std::size_t elements = length / sizeof(u32); | ||
| 766 | |||
| 767 | if (elements > max_number_npad_ids) { | ||
| 768 | return InvalidArraySize; | ||
| 769 | } | ||
| 770 | |||
| 764 | supported_npad_id_types.clear(); | 771 | supported_npad_id_types.clear(); |
| 765 | supported_npad_id_types.resize(length / sizeof(u32)); | 772 | supported_npad_id_types.resize(elements); |
| 766 | std::memcpy(supported_npad_id_types.data(), data.data(), length); | 773 | std::memcpy(supported_npad_id_types.data(), data.data(), length); |
| 774 | return ResultSuccess; | ||
| 767 | } | 775 | } |
| 768 | 776 | ||
| 769 | void Controller_NPad::GetSupportedNpadIdTypes(u32* data, std::size_t max_length) { | 777 | void Controller_NPad::GetSupportedNpadIdTypes(u32* data, std::size_t max_length) { |
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index 1f7d33459..02cc00920 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h | |||
| @@ -96,7 +96,7 @@ public: | |||
| 96 | void SetSupportedStyleSet(Core::HID::NpadStyleTag style_set); | 96 | void SetSupportedStyleSet(Core::HID::NpadStyleTag style_set); |
| 97 | Core::HID::NpadStyleTag GetSupportedStyleSet() const; | 97 | Core::HID::NpadStyleTag GetSupportedStyleSet() const; |
| 98 | 98 | ||
| 99 | void SetSupportedNpadIdTypes(std::span<const u8> data); | 99 | Result SetSupportedNpadIdTypes(std::span<const u8> data); |
| 100 | void GetSupportedNpadIdTypes(u32* data, std::size_t max_length); | 100 | void GetSupportedNpadIdTypes(u32* data, std::size_t max_length); |
| 101 | std::size_t GetSupportedNpadIdTypesSize() const; | 101 | std::size_t GetSupportedNpadIdTypesSize() const; |
| 102 | 102 | ||
diff --git a/src/core/hle/service/hid/errors.h b/src/core/hle/service/hid/errors.h index 76208e9a4..9585bdaf0 100644 --- a/src/core/hle/service/hid/errors.h +++ b/src/core/hle/service/hid/errors.h | |||
| @@ -18,6 +18,7 @@ constexpr Result NpadIsDualJoycon{ErrorModule::HID, 601}; | |||
| 18 | constexpr Result NpadIsSameType{ErrorModule::HID, 602}; | 18 | constexpr Result NpadIsSameType{ErrorModule::HID, 602}; |
| 19 | constexpr Result InvalidNpadId{ErrorModule::HID, 709}; | 19 | constexpr Result InvalidNpadId{ErrorModule::HID, 709}; |
| 20 | constexpr Result NpadNotConnected{ErrorModule::HID, 710}; | 20 | constexpr Result NpadNotConnected{ErrorModule::HID, 710}; |
| 21 | constexpr Result InvalidArraySize{ErrorModule::HID, 715}; | ||
| 21 | constexpr Result InvalidPalmaHandle{ErrorModule::HID, 3302}; | 22 | constexpr Result InvalidPalmaHandle{ErrorModule::HID, 3302}; |
| 22 | 23 | ||
| 23 | } // namespace Service::HID | 24 | } // namespace Service::HID |
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index f15f1a6bb..ac2c0c76d 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp | |||
| @@ -1025,13 +1025,13 @@ void Hid::SetSupportedNpadIdType(Kernel::HLERequestContext& ctx) { | |||
| 1025 | IPC::RequestParser rp{ctx}; | 1025 | IPC::RequestParser rp{ctx}; |
| 1026 | const auto applet_resource_user_id{rp.Pop<u64>()}; | 1026 | const auto applet_resource_user_id{rp.Pop<u64>()}; |
| 1027 | 1027 | ||
| 1028 | applet_resource->GetController<Controller_NPad>(HidController::NPad) | 1028 | const auto result = applet_resource->GetController<Controller_NPad>(HidController::NPad) |
| 1029 | .SetSupportedNpadIdTypes(ctx.ReadBuffer()); | 1029 | .SetSupportedNpadIdTypes(ctx.ReadBuffer()); |
| 1030 | 1030 | ||
| 1031 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); | 1031 | LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); |
| 1032 | 1032 | ||
| 1033 | IPC::ResponseBuilder rb{ctx, 2}; | 1033 | IPC::ResponseBuilder rb{ctx, 2}; |
| 1034 | rb.Push(ResultSuccess); | 1034 | rb.Push(result); |
| 1035 | } | 1035 | } |
| 1036 | 1036 | ||
| 1037 | void Hid::ActivateNpad(Kernel::HLERequestContext& ctx) { | 1037 | void Hid::ActivateNpad(Kernel::HLERequestContext& ctx) { |