diff options
| -rw-r--r-- | src/core/hle/service/am/am.cpp | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index bb77c2569..8e1fe9438 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp | |||
| @@ -1047,20 +1047,21 @@ void IStorageAccessor::Write(Kernel::HLERequestContext& ctx) { | |||
| 1047 | 1047 | ||
| 1048 | const u64 offset{rp.Pop<u64>()}; | 1048 | const u64 offset{rp.Pop<u64>()}; |
| 1049 | const std::vector<u8> data{ctx.ReadBuffer()}; | 1049 | const std::vector<u8> data{ctx.ReadBuffer()}; |
| 1050 | const std::size_t size{std::min(data.size(), backing.GetSize() - offset)}; | ||
| 1050 | 1051 | ||
| 1051 | LOG_DEBUG(Service_AM, "called, offset={}, size={}", offset, data.size()); | 1052 | LOG_DEBUG(Service_AM, "called, offset={}, size={}", offset, size); |
| 1052 | 1053 | ||
| 1053 | if (data.size() > backing.GetSize() - offset) { | 1054 | if (offset > backing.GetSize()) { |
| 1054 | LOG_ERROR(Service_AM, | 1055 | LOG_ERROR(Service_AM, |
| 1055 | "offset is out of bounds, backing_buffer_sz={}, data_size={}, offset={}", | 1056 | "offset is out of bounds, backing_buffer_sz={}, data_size={}, offset={}", |
| 1056 | backing.GetSize(), data.size(), offset); | 1057 | backing.GetSize(), size, offset); |
| 1057 | 1058 | ||
| 1058 | IPC::ResponseBuilder rb{ctx, 2}; | 1059 | IPC::ResponseBuilder rb{ctx, 2}; |
| 1059 | rb.Push(ERR_SIZE_OUT_OF_BOUNDS); | 1060 | rb.Push(ERR_SIZE_OUT_OF_BOUNDS); |
| 1060 | return; | 1061 | return; |
| 1061 | } | 1062 | } |
| 1062 | 1063 | ||
| 1063 | std::memcpy(backing.GetData().data() + offset, data.data(), data.size()); | 1064 | std::memcpy(backing.GetData().data() + offset, data.data(), size); |
| 1064 | 1065 | ||
| 1065 | IPC::ResponseBuilder rb{ctx, 2}; | 1066 | IPC::ResponseBuilder rb{ctx, 2}; |
| 1066 | rb.Push(RESULT_SUCCESS); | 1067 | rb.Push(RESULT_SUCCESS); |
| @@ -1070,11 +1071,11 @@ void IStorageAccessor::Read(Kernel::HLERequestContext& ctx) { | |||
| 1070 | IPC::RequestParser rp{ctx}; | 1071 | IPC::RequestParser rp{ctx}; |
| 1071 | 1072 | ||
| 1072 | const u64 offset{rp.Pop<u64>()}; | 1073 | const u64 offset{rp.Pop<u64>()}; |
| 1073 | const std::size_t size{ctx.GetWriteBufferSize()}; | 1074 | const std::size_t size{std::min(ctx.GetWriteBufferSize(), backing.GetSize() - offset)}; |
| 1074 | 1075 | ||
| 1075 | LOG_DEBUG(Service_AM, "called, offset={}, size={}", offset, size); | 1076 | LOG_DEBUG(Service_AM, "called, offset={}, size={}", offset, size); |
| 1076 | 1077 | ||
| 1077 | if (size > backing.GetSize() - offset) { | 1078 | if (offset > backing.GetSize()) { |
| 1078 | LOG_ERROR(Service_AM, "offset is out of bounds, backing_buffer_sz={}, size={}, offset={}", | 1079 | LOG_ERROR(Service_AM, "offset is out of bounds, backing_buffer_sz={}, size={}, offset={}", |
| 1079 | backing.GetSize(), size, offset); | 1080 | backing.GetSize(), size, offset); |
| 1080 | 1081 | ||