diff options
| author | 2015-12-15 11:34:35 -0500 | |
|---|---|---|
| committer | 2015-12-24 09:19:27 -0500 | |
| commit | 282f2c8042a40e6e3f731cc96a7c43f093cd53d8 (patch) | |
| tree | 3e6003af3bf6b83234ccb5b705e1a60d609b65f6 | |
| parent | Merge pull request #1267 from yuriks/flipped-framebuffer (diff) | |
| download | yuzu-282f2c8042a40e6e3f731cc96a7c43f093cd53d8.tar.gz yuzu-282f2c8042a40e6e3f731cc96a7c43f093cd53d8.tar.xz yuzu-282f2c8042a40e6e3f731cc96a7c43f093cd53d8.zip | |
HLE/Sockets: Fixed the buffer offset in recvfrom.
Closes #1277
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 | ||