diff options
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 | ||