summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Subv2016-04-19 01:08:16 -0500
committerGravatar Subv2016-05-28 13:52:49 -0500
commit99695d03d2ecce9bb6f8dbf23e763378b89b6759 (patch)
tree3a797839cb1b7a60f3fc4aa36d714ee222da7764 /src
parentSSL_C: Remove use of Memory::GetPointer (diff)
downloadyuzu-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.cpp100
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)