diff options
| author | 2016-04-19 01:08:16 -0500 | |
|---|---|---|
| committer | 2016-05-28 13:52:49 -0500 | |
| commit | 99695d03d2ecce9bb6f8dbf23e763378b89b6759 (patch) | |
| tree | 3a797839cb1b7a60f3fc4aa36d714ee222da7764 /src | |
| parent | SSL_C: Remove use of Memory::GetPointer (diff) | |
| download | yuzu-99695d03d2ecce9bb6f8dbf23e763378b89b6759.tar.gz yuzu-99695d03d2ecce9bb6f8dbf23e763378b89b6759.tar.xz yuzu-99695d03d2ecce9bb6f8dbf23e763378b89b6759.zip | |
SOC_U: Remove usage of GetPointer
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/soc_u.cpp | 100 |
1 files changed, 73 insertions, 27 deletions
diff --git a/src/core/hle/service/soc_u.cpp b/src/core/hle/service/soc_u.cpp index d3e5d4bca..a7404085b 100644 --- a/src/core/hle/service/soc_u.cpp +++ b/src/core/hle/service/soc_u.cpp | |||
| @@ -373,14 +373,18 @@ static void Bind(Service::Interface* self) { | |||
| 373 | u32* cmd_buffer = Kernel::GetCommandBuffer(); | 373 | u32* cmd_buffer = Kernel::GetCommandBuffer(); |
| 374 | u32 socket_handle = cmd_buffer[1]; | 374 | u32 socket_handle = cmd_buffer[1]; |
| 375 | u32 len = cmd_buffer[2]; | 375 | u32 len = cmd_buffer[2]; |
| 376 | CTRSockAddr* ctr_sock_addr = reinterpret_cast<CTRSockAddr*>(Memory::GetPointer(cmd_buffer[6])); | ||
| 377 | 376 | ||
| 378 | if (ctr_sock_addr == nullptr) { | 377 | // Virtual address of the sock_addr structure |
| 378 | VAddr sock_addr_addr = cmd_buffer[6]; | ||
| 379 | if (!Memory::IsValidVirtualAddress(sock_addr_addr)) { | ||
| 379 | cmd_buffer[1] = -1; // TODO(Subv): Correct code | 380 | cmd_buffer[1] = -1; // TODO(Subv): Correct code |
| 380 | return; | 381 | return; |
| 381 | } | 382 | } |
| 382 | 383 | ||
| 383 | sockaddr sock_addr = CTRSockAddr::ToPlatform(*ctr_sock_addr); | 384 | CTRSockAddr ctr_sock_addr; |
| 385 | Memory::ReadBlock(sock_addr_addr, reinterpret_cast<u8*>(&ctr_sock_addr), sizeof(CTRSockAddr)); | ||
| 386 | |||
| 387 | sockaddr sock_addr = CTRSockAddr::ToPlatform(ctr_sock_addr); | ||
| 384 | 388 | ||
| 385 | int res = ::bind(socket_handle, &sock_addr, std::max<u32>(sizeof(sock_addr), len)); | 389 | int res = ::bind(socket_handle, &sock_addr, std::max<u32>(sizeof(sock_addr), len)); |
| 386 | 390 | ||
| @@ -496,7 +500,7 @@ static void Accept(Service::Interface* self) { | |||
| 496 | result = TranslateError(GET_ERRNO); | 500 | result = TranslateError(GET_ERRNO); |
| 497 | } else { | 501 | } else { |
| 498 | CTRSockAddr ctr_addr = CTRSockAddr::FromPlatform(addr); | 502 | CTRSockAddr ctr_addr = CTRSockAddr::FromPlatform(addr); |
| 499 | Memory::WriteBlock(cmd_buffer[0x104 >> 2], (const u8*)&ctr_addr, max_addr_len); | 503 | Memory::WriteBlock(cmd_buffer[0x104 >> 2], &ctr_addr, sizeof(ctr_addr)); |
| 500 | } | 504 | } |
| 501 | 505 | ||
| 502 | cmd_buffer[0] = IPC::MakeHeader(4, 2, 2); | 506 | cmd_buffer[0] = IPC::MakeHeader(4, 2, 2); |
| @@ -547,20 +551,31 @@ static void SendTo(Service::Interface* self) { | |||
| 547 | u32 flags = cmd_buffer[3]; | 551 | u32 flags = cmd_buffer[3]; |
| 548 | u32 addr_len = cmd_buffer[4]; | 552 | u32 addr_len = cmd_buffer[4]; |
| 549 | 553 | ||
| 550 | u8* input_buff = Memory::GetPointer(cmd_buffer[8]); | 554 | VAddr input_buff_address = cmd_buffer[8]; |
| 551 | CTRSockAddr* ctr_dest_addr = reinterpret_cast<CTRSockAddr*>(Memory::GetPointer(cmd_buffer[10])); | 555 | if (!Memory::IsValidVirtualAddress(input_buff_address)) { |
| 556 | cmd_buffer[1] = -1; // TODO(Subv): Find the right error code | ||
| 557 | return; | ||
| 558 | } | ||
| 552 | 559 | ||
| 553 | if (ctr_dest_addr == nullptr) { | 560 | // Memory address of the dest_addr structure |
| 561 | VAddr dest_addr_addr = cmd_buffer[10]; | ||
| 562 | if (!Memory::IsValidVirtualAddress(dest_addr_addr)) { | ||
| 554 | cmd_buffer[1] = -1; // TODO(Subv): Find the right error code | 563 | cmd_buffer[1] = -1; // TODO(Subv): Find the right error code |
| 555 | return; | 564 | return; |
| 556 | } | 565 | } |
| 557 | 566 | ||
| 567 | std::vector<u8> input_buff(len); | ||
| 568 | Memory::ReadBlock(input_buff_address, input_buff.data(), input_buff.size()); | ||
| 569 | |||
| 570 | CTRSockAddr ctr_dest_addr; | ||
| 571 | Memory::ReadBlock(dest_addr_addr, reinterpret_cast<u8*>(&ctr_dest_addr), sizeof(ctr_dest_addr)); | ||
| 572 | |||
| 558 | int ret = -1; | 573 | int ret = -1; |
| 559 | if (addr_len > 0) { | 574 | if (addr_len > 0) { |
| 560 | sockaddr dest_addr = CTRSockAddr::ToPlatform(*ctr_dest_addr); | 575 | sockaddr dest_addr = CTRSockAddr::ToPlatform(ctr_dest_addr); |
| 561 | ret = ::sendto(socket_handle, (const char*)input_buff, len, flags, &dest_addr, sizeof(dest_addr)); | 576 | ret = ::sendto(socket_handle, reinterpret_cast<const char*>(input_buff.data()), len, flags, &dest_addr, sizeof(dest_addr)); |
| 562 | } else { | 577 | } else { |
| 563 | ret = ::sendto(socket_handle, (const char*)input_buff, len, flags, nullptr, 0); | 578 | ret = ::sendto(socket_handle, reinterpret_cast<const char*>(input_buff.data()), len, flags, nullptr, 0); |
| 564 | } | 579 | } |
| 565 | 580 | ||
| 566 | int result = 0; | 581 | int result = 0; |
| @@ -591,14 +606,24 @@ static void RecvFrom(Service::Interface* self) { | |||
| 591 | 606 | ||
| 592 | std::memcpy(&buffer_parameters, &cmd_buffer[64], sizeof(buffer_parameters)); | 607 | std::memcpy(&buffer_parameters, &cmd_buffer[64], sizeof(buffer_parameters)); |
| 593 | 608 | ||
| 594 | u8* output_buff = Memory::GetPointer(buffer_parameters.output_buffer_addr); | 609 | if (!Memory::IsValidVirtualAddress(buffer_parameters.output_buffer_addr)) { |
| 610 | cmd_buffer[1] = -1; // TODO(Subv): Find the right error code | ||
| 611 | return; | ||
| 612 | } | ||
| 613 | |||
| 614 | if (!Memory::IsValidVirtualAddress(buffer_parameters.output_src_address_buffer)) { | ||
| 615 | cmd_buffer[1] = -1; // TODO(Subv): Find the right error code | ||
| 616 | return; | ||
| 617 | } | ||
| 618 | |||
| 619 | std::vector<u8> output_buff(len); | ||
| 595 | sockaddr src_addr; | 620 | sockaddr src_addr; |
| 596 | socklen_t src_addr_len = sizeof(src_addr); | 621 | socklen_t src_addr_len = sizeof(src_addr); |
| 597 | int ret = ::recvfrom(socket_handle, (char*)output_buff, len, flags, &src_addr, &src_addr_len); | 622 | int ret = ::recvfrom(socket_handle, reinterpret_cast<char*>(output_buff.data()), len, flags, &src_addr, &src_addr_len); |
| 598 | 623 | ||
| 599 | if (ret >= 0 && buffer_parameters.output_src_address_buffer != 0 && src_addr_len > 0) { | 624 | if (ret >= 0 && buffer_parameters.output_src_address_buffer != 0 && src_addr_len > 0) { |
| 600 | CTRSockAddr* ctr_src_addr = reinterpret_cast<CTRSockAddr*>(Memory::GetPointer(buffer_parameters.output_src_address_buffer)); | 625 | CTRSockAddr ctr_src_addr = CTRSockAddr::FromPlatform(src_addr); |
| 601 | *ctr_src_addr = CTRSockAddr::FromPlatform(src_addr); | 626 | Memory::WriteBlock(buffer_parameters.output_src_address_buffer, reinterpret_cast<u8*>(&ctr_src_addr), sizeof(ctr_src_addr)); |
| 602 | } | 627 | } |
| 603 | 628 | ||
| 604 | int result = 0; | 629 | int result = 0; |
| @@ -606,6 +631,9 @@ static void RecvFrom(Service::Interface* self) { | |||
| 606 | if (ret == SOCKET_ERROR_VALUE) { | 631 | if (ret == SOCKET_ERROR_VALUE) { |
| 607 | result = TranslateError(GET_ERRNO); | 632 | result = TranslateError(GET_ERRNO); |
| 608 | total_received = 0; | 633 | total_received = 0; |
| 634 | } else { | ||
| 635 | // Write only the data we received to avoid overwriting parts of the buffer with zeros | ||
| 636 | Memory::WriteBlock(buffer_parameters.output_buffer_addr, output_buff.data(), total_received); | ||
| 609 | } | 637 | } |
| 610 | 638 | ||
| 611 | cmd_buffer[1] = result; | 639 | cmd_buffer[1] = result; |
| @@ -617,18 +645,28 @@ static void Poll(Service::Interface* self) { | |||
| 617 | u32* cmd_buffer = Kernel::GetCommandBuffer(); | 645 | u32* cmd_buffer = Kernel::GetCommandBuffer(); |
| 618 | u32 nfds = cmd_buffer[1]; | 646 | u32 nfds = cmd_buffer[1]; |
| 619 | int timeout = cmd_buffer[2]; | 647 | int timeout = cmd_buffer[2]; |
| 620 | CTRPollFD* input_fds = reinterpret_cast<CTRPollFD*>(Memory::GetPointer(cmd_buffer[6])); | 648 | |
| 621 | CTRPollFD* output_fds = reinterpret_cast<CTRPollFD*>(Memory::GetPointer(cmd_buffer[0x104 >> 2])); | 649 | VAddr input_fds_addr = cmd_buffer[6]; |
| 650 | VAddr output_fds_addr = cmd_buffer[0x104 >> 2]; | ||
| 651 | if (!Memory::IsValidVirtualAddress(input_fds_addr) || !Memory::IsValidVirtualAddress(output_fds_addr)) { | ||
| 652 | cmd_buffer[1] = -1; // TODO(Subv): Find correct error code. | ||
| 653 | return; | ||
| 654 | } | ||
| 655 | |||
| 656 | std::vector<CTRPollFD> ctr_fds(nfds); | ||
| 657 | Memory::ReadBlock(input_fds_addr, reinterpret_cast<u8*>(ctr_fds.data()), nfds * sizeof(CTRPollFD)); | ||
| 622 | 658 | ||
| 623 | // The 3ds_pollfd and the pollfd structures may be different (Windows/Linux have different sizes) | 659 | // The 3ds_pollfd and the pollfd structures may be different (Windows/Linux have different sizes) |
| 624 | // so we have to copy the data | 660 | // so we have to copy the data |
| 625 | std::vector<pollfd> platform_pollfd(nfds); | 661 | std::vector<pollfd> platform_pollfd(nfds); |
| 626 | std::transform(input_fds, input_fds + nfds, platform_pollfd.begin(), CTRPollFD::ToPlatform); | 662 | std::transform(ctr_fds.begin(), ctr_fds.end(), platform_pollfd.begin(), CTRPollFD::ToPlatform); |
| 627 | 663 | ||
| 628 | const int ret = ::poll(platform_pollfd.data(), nfds, timeout); | 664 | const int ret = ::poll(platform_pollfd.data(), nfds, timeout); |
| 629 | 665 | ||
| 630 | // Now update the output pollfd structure | 666 | // Now update the output pollfd structure |
| 631 | std::transform(platform_pollfd.begin(), platform_pollfd.end(), output_fds, CTRPollFD::FromPlatform); | 667 | std::transform(platform_pollfd.begin(), platform_pollfd.end(), ctr_fds.begin(), CTRPollFD::FromPlatform); |
| 668 | |||
| 669 | Memory::WriteBlock(output_fds_addr, reinterpret_cast<u8*>(ctr_fds.data()), nfds * sizeof(CTRPollFD)); | ||
| 632 | 670 | ||
| 633 | int result = 0; | 671 | int result = 0; |
| 634 | if (ret == SOCKET_ERROR_VALUE) | 672 | if (ret == SOCKET_ERROR_VALUE) |
| @@ -643,14 +681,16 @@ static void GetSockName(Service::Interface* self) { | |||
| 643 | u32 socket_handle = cmd_buffer[1]; | 681 | u32 socket_handle = cmd_buffer[1]; |
| 644 | socklen_t ctr_len = cmd_buffer[2]; | 682 | socklen_t ctr_len = cmd_buffer[2]; |
| 645 | 683 | ||
| 646 | CTRSockAddr* ctr_dest_addr = reinterpret_cast<CTRSockAddr*>(Memory::GetPointer(cmd_buffer[0x104 >> 2])); | 684 | // Memory address of the ctr_dest_addr structure |
| 685 | VAddr ctr_dest_addr_addr = cmd_buffer[0x104 >> 2]; | ||
| 647 | 686 | ||
| 648 | sockaddr dest_addr; | 687 | sockaddr dest_addr; |
| 649 | socklen_t dest_addr_len = sizeof(dest_addr); | 688 | socklen_t dest_addr_len = sizeof(dest_addr); |
| 650 | int ret = ::getsockname(socket_handle, &dest_addr, &dest_addr_len); | 689 | int ret = ::getsockname(socket_handle, &dest_addr, &dest_addr_len); |
| 651 | 690 | ||
| 652 | if (ctr_dest_addr != nullptr) { | 691 | if (ctr_dest_addr_addr != 0 && Memory::IsValidVirtualAddress(ctr_dest_addr_addr)) { |
| 653 | *ctr_dest_addr = CTRSockAddr::FromPlatform(dest_addr); | 692 | CTRSockAddr ctr_dest_addr = CTRSockAddr::FromPlatform(dest_addr); |
| 693 | Memory::WriteBlock(ctr_dest_addr_addr, reinterpret_cast<u8*>(&ctr_dest_addr), sizeof(ctr_dest_addr)); | ||
| 654 | } else { | 694 | } else { |
| 655 | cmd_buffer[1] = -1; // TODO(Subv): Verify error | 695 | cmd_buffer[1] = -1; // TODO(Subv): Verify error |
| 656 | return; | 696 | return; |
| @@ -682,14 +722,16 @@ static void GetPeerName(Service::Interface* self) { | |||
| 682 | u32 socket_handle = cmd_buffer[1]; | 722 | u32 socket_handle = cmd_buffer[1]; |
| 683 | socklen_t len = cmd_buffer[2]; | 723 | socklen_t len = cmd_buffer[2]; |
| 684 | 724 | ||
| 685 | CTRSockAddr* ctr_dest_addr = reinterpret_cast<CTRSockAddr*>(Memory::GetPointer(cmd_buffer[0x104 >> 2])); | 725 | // Memory address of the ctr_dest_addr structure |
| 726 | VAddr ctr_dest_addr_addr = cmd_buffer[0x104 >> 2]; | ||
| 686 | 727 | ||
| 687 | sockaddr dest_addr; | 728 | sockaddr dest_addr; |
| 688 | socklen_t dest_addr_len = sizeof(dest_addr); | 729 | socklen_t dest_addr_len = sizeof(dest_addr); |
| 689 | int ret = ::getpeername(socket_handle, &dest_addr, &dest_addr_len); | 730 | int ret = ::getpeername(socket_handle, &dest_addr, &dest_addr_len); |
| 690 | 731 | ||
| 691 | if (ctr_dest_addr != nullptr) { | 732 | if (ctr_dest_addr_addr != 0 && Memory::IsValidVirtualAddress(ctr_dest_addr_addr)) { |
| 692 | *ctr_dest_addr = CTRSockAddr::FromPlatform(dest_addr); | 733 | CTRSockAddr ctr_dest_addr = CTRSockAddr::FromPlatform(dest_addr); |
| 734 | Memory::WriteBlock(ctr_dest_addr_addr, reinterpret_cast<u8*>(&ctr_dest_addr), sizeof(ctr_dest_addr)); | ||
| 693 | } else { | 735 | } else { |
| 694 | cmd_buffer[1] = -1; | 736 | cmd_buffer[1] = -1; |
| 695 | return; | 737 | return; |
| @@ -711,13 +753,17 @@ static void Connect(Service::Interface* self) { | |||
| 711 | u32 socket_handle = cmd_buffer[1]; | 753 | u32 socket_handle = cmd_buffer[1]; |
| 712 | socklen_t len = cmd_buffer[2]; | 754 | socklen_t len = cmd_buffer[2]; |
| 713 | 755 | ||
| 714 | CTRSockAddr* ctr_input_addr = reinterpret_cast<CTRSockAddr*>(Memory::GetPointer(cmd_buffer[6])); | 756 | // Memory address of the ctr_input_addr structure |
| 715 | if (ctr_input_addr == nullptr) { | 757 | VAddr ctr_input_addr_addr = cmd_buffer[6]; |
| 758 | if (!Memory::IsValidVirtualAddress(ctr_input_addr_addr)) { | ||
| 716 | cmd_buffer[1] = -1; // TODO(Subv): Verify error | 759 | cmd_buffer[1] = -1; // TODO(Subv): Verify error |
| 717 | return; | 760 | return; |
| 718 | } | 761 | } |
| 719 | 762 | ||
| 720 | sockaddr input_addr = CTRSockAddr::ToPlatform(*ctr_input_addr); | 763 | CTRSockAddr ctr_input_addr; |
| 764 | Memory::ReadBlock(ctr_input_addr_addr, reinterpret_cast<u8*>(&ctr_input_addr), sizeof(ctr_input_addr)); | ||
| 765 | |||
| 766 | sockaddr input_addr = CTRSockAddr::ToPlatform(ctr_input_addr); | ||
| 721 | int ret = ::connect(socket_handle, &input_addr, sizeof(input_addr)); | 767 | int ret = ::connect(socket_handle, &input_addr, sizeof(input_addr)); |
| 722 | int result = 0; | 768 | int result = 0; |
| 723 | if (ret != 0) | 769 | if (ret != 0) |