summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar liamwhite2023-02-08 10:09:26 -0500
committerGravatar GitHub2023-02-08 10:09:26 -0500
commitf6477b91f9abe4ad4b4101f9f80ddb3412462a5d (patch)
treef7fcacd7425bc75629ae8dffc7df708d54d4adb0 /src
parentMerge pull request #9739 from liamwhite/old-gcc-fix (diff)
parentservice: hid: Return error if arguments of SetSupportedNpadIdType is invalid (diff)
downloadyuzu-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.cpp12
-rw-r--r--src/core/hle/service/hid/controllers/npad.h2
-rw-r--r--src/core/hle/service/hid/errors.h1
-rw-r--r--src/core/hle/service/hid/hid.cpp6
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
761void Controller_NPad::SetSupportedNpadIdTypes(std::span<const u8> data) { 761Result 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
769void Controller_NPad::GetSupportedNpadIdTypes(u32* data, std::size_t max_length) { 777void 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};
18constexpr Result NpadIsSameType{ErrorModule::HID, 602}; 18constexpr Result NpadIsSameType{ErrorModule::HID, 602};
19constexpr Result InvalidNpadId{ErrorModule::HID, 709}; 19constexpr Result InvalidNpadId{ErrorModule::HID, 709};
20constexpr Result NpadNotConnected{ErrorModule::HID, 710}; 20constexpr Result NpadNotConnected{ErrorModule::HID, 710};
21constexpr Result InvalidArraySize{ErrorModule::HID, 715};
21constexpr Result InvalidPalmaHandle{ErrorModule::HID, 3302}; 22constexpr 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
1037void Hid::ActivateNpad(Kernel::HLERequestContext& ctx) { 1037void Hid::ActivateNpad(Kernel::HLERequestContext& ctx) {