diff options
| author | 2016-01-05 13:52:25 -0500 | |
|---|---|---|
| committer | 2016-01-05 13:52:25 -0500 | |
| commit | 848effe9c3aa19b48687c7297db3b71ddb42366a (patch) | |
| tree | 7fc173f0d69179ab3aac49837db8e04406ab3024 /src | |
| parent | Merge pull request #1339 from archshift/cmake-2015 (diff) | |
| parent | HLE/Sockets: Fixed the buffer offset in recvfrom. (diff) | |
| download | yuzu-848effe9c3aa19b48687c7297db3b71ddb42366a.tar.gz yuzu-848effe9c3aa19b48687c7297db3b71ddb42366a.tar.xz yuzu-848effe9c3aa19b48687c7297db3b71ddb42366a.zip | |
Merge pull request #1283 from Subv/soc_fixup
HLE/Sockets: Fixed the buffer offset in recvfrom.
Diffstat (limited to '')
| -rw-r--r-- | src/core/hle/service/soc_u.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/core/hle/service/soc_u.cpp b/src/core/hle/service/soc_u.cpp index 633b66fe2..822b093f4 100644 --- a/src/core/hle/service/soc_u.cpp +++ b/src/core/hle/service/soc_u.cpp | |||
| @@ -552,13 +552,23 @@ static void RecvFrom(Service::Interface* self) { | |||
| 552 | u32 flags = cmd_buffer[3]; | 552 | u32 flags = cmd_buffer[3]; |
| 553 | socklen_t addr_len = static_cast<socklen_t>(cmd_buffer[4]); | 553 | socklen_t addr_len = static_cast<socklen_t>(cmd_buffer[4]); |
| 554 | 554 | ||
| 555 | u8* output_buff = Memory::GetPointer(cmd_buffer[0x104 >> 2]); | 555 | struct |
| 556 | { | ||
| 557 | u32 output_buffer_descriptor; | ||
| 558 | u32 output_buffer_addr; | ||
| 559 | u32 address_buffer_descriptor; | ||
| 560 | u32 output_src_address_buffer; | ||
| 561 | } buffer_parameters; | ||
| 562 | |||
| 563 | std::memcpy(&buffer_parameters, &cmd_buffer[64], sizeof(buffer_parameters)); | ||
| 564 | |||
| 565 | u8* output_buff = Memory::GetPointer(buffer_parameters.output_buffer_addr); | ||
| 556 | sockaddr src_addr; | 566 | sockaddr src_addr; |
| 557 | socklen_t src_addr_len = sizeof(src_addr); | 567 | socklen_t src_addr_len = sizeof(src_addr); |
| 558 | int ret = ::recvfrom(socket_handle, (char*)output_buff, len, flags, &src_addr, &src_addr_len); | 568 | int ret = ::recvfrom(socket_handle, (char*)output_buff, len, flags, &src_addr, &src_addr_len); |
| 559 | 569 | ||
| 560 | if (cmd_buffer[0x1A0 >> 2] != 0) { | 570 | if (buffer_parameters.output_src_address_buffer != 0) { |
| 561 | CTRSockAddr* ctr_src_addr = reinterpret_cast<CTRSockAddr*>(Memory::GetPointer(cmd_buffer[0x1A0 >> 2])); | 571 | CTRSockAddr* ctr_src_addr = reinterpret_cast<CTRSockAddr*>(Memory::GetPointer(buffer_parameters.output_src_address_buffer)); |
| 562 | *ctr_src_addr = CTRSockAddr::FromPlatform(src_addr); | 572 | *ctr_src_addr = CTRSockAddr::FromPlatform(src_addr); |
| 563 | } | 573 | } |
| 564 | 574 | ||