Просмотр исходного кода

Merge pull request #9747 from german77/SetSupportedNpadIdTypes

service: hid: Return error if arguments of SetSupportedNpadIdType is invalid
liamwhite 3 лет назад
Родитель
Сommit
f6477b91f9

+ 10 - 2
src/core/hle/service/hid/controllers/npad.cpp

@@ -758,12 +758,20 @@ Core::HID::NpadStyleTag Controller_NPad::GetSupportedStyleSet() const {
     return hid_core.GetSupportedStyleTag();
 }
 
-void Controller_NPad::SetSupportedNpadIdTypes(std::span<const u8> data) {
+Result Controller_NPad::SetSupportedNpadIdTypes(std::span<const u8> data) {
+    constexpr std::size_t max_number_npad_ids = 0xa;
     const auto length = data.size();
     ASSERT(length > 0 && (length % sizeof(u32)) == 0);
+    const std::size_t elements = length / sizeof(u32);
+
+    if (elements > max_number_npad_ids) {
+        return InvalidArraySize;
+    }
+
     supported_npad_id_types.clear();
-    supported_npad_id_types.resize(length / sizeof(u32));
+    supported_npad_id_types.resize(elements);
     std::memcpy(supported_npad_id_types.data(), data.data(), length);
+    return ResultSuccess;
 }
 
 void Controller_NPad::GetSupportedNpadIdTypes(u32* data, std::size_t max_length) {

+ 1 - 1
src/core/hle/service/hid/controllers/npad.h

@@ -96,7 +96,7 @@ public:
     void SetSupportedStyleSet(Core::HID::NpadStyleTag style_set);
     Core::HID::NpadStyleTag GetSupportedStyleSet() const;
 
-    void SetSupportedNpadIdTypes(std::span<const u8> data);
+    Result SetSupportedNpadIdTypes(std::span<const u8> data);
     void GetSupportedNpadIdTypes(u32* data, std::size_t max_length);
     std::size_t GetSupportedNpadIdTypesSize() const;
 

+ 1 - 0
src/core/hle/service/hid/errors.h

@@ -18,6 +18,7 @@ constexpr Result NpadIsDualJoycon{ErrorModule::HID, 601};
 constexpr Result NpadIsSameType{ErrorModule::HID, 602};
 constexpr Result InvalidNpadId{ErrorModule::HID, 709};
 constexpr Result NpadNotConnected{ErrorModule::HID, 710};
+constexpr Result InvalidArraySize{ErrorModule::HID, 715};
 constexpr Result InvalidPalmaHandle{ErrorModule::HID, 3302};
 
 } // namespace Service::HID

+ 3 - 3
src/core/hle/service/hid/hid.cpp

@@ -1025,13 +1025,13 @@ void Hid::SetSupportedNpadIdType(Kernel::HLERequestContext& ctx) {
     IPC::RequestParser rp{ctx};
     const auto applet_resource_user_id{rp.Pop<u64>()};
 
-    applet_resource->GetController<Controller_NPad>(HidController::NPad)
-        .SetSupportedNpadIdTypes(ctx.ReadBuffer());
+    const auto result = applet_resource->GetController<Controller_NPad>(HidController::NPad)
+                            .SetSupportedNpadIdTypes(ctx.ReadBuffer());
 
     LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
 
     IPC::ResponseBuilder rb{ctx, 2};
-    rb.Push(ResultSuccess);
+    rb.Push(result);
 }
 
 void Hid::ActivateNpad(Kernel::HLERequestContext& ctx) {