| 660 | } |
| 661 | |
| 662 | int |
| 663 | ff_hook_accept(int fd, struct sockaddr *addr, socklen_t *addrlen) |
| 664 | { |
| 665 | DEBUG_LOG("ff_hook_accept, fd:%d, addr:%p, len:%p\n", fd, addr, addrlen); |
| 666 | |
| 667 | if ((addr == NULL && addrlen != NULL) || |
| 668 | (addr != NULL && addrlen == NULL)) { |
| 669 | errno = EINVAL; |
| 670 | return -1; |
| 671 | } |
| 672 | |
| 673 | CHECK_FD_OWNERSHIP(accept, (fd, addr, addrlen)); |
| 674 | |
| 675 | DEFINE_REQ_ARGS_STATIC(accept); |
| 676 | static __thread struct sockaddr *sh_addr = NULL; |
| 677 | static __thread socklen_t sh_addr_len = 0; |
| 678 | static __thread socklen_t *sh_addrlen = NULL; |
| 679 | |
| 680 | if (addr != NULL) { |
| 681 | if (sh_addr == NULL || sh_addr_len < *addrlen) { |
| 682 | if(sh_addr) { |
| 683 | share_mem_free(sh_addr); |
| 684 | } |
| 685 | |
| 686 | sh_addr_len = *addrlen; |
| 687 | sh_addr = share_mem_alloc(sh_addr_len); |
| 688 | if (sh_addr == NULL) { |
| 689 | RETURN_ERROR_NOFREE(ENOMEM); |
| 690 | } |
| 691 | } |
| 692 | |
| 693 | if (sh_addrlen == NULL) { |
| 694 | sh_addrlen = share_mem_alloc(sizeof(socklen_t)); |
| 695 | if (sh_addrlen == NULL) { |
| 696 | //share_mem_free(sh_addr); // Don't free |
| 697 | RETURN_ERROR_NOFREE(ENOMEM); |
| 698 | } |
| 699 | } |
| 700 | *sh_addrlen = *addrlen; |
| 701 | |
| 702 | args->addr = sh_addr; |
| 703 | args->addrlen = sh_addrlen; |
| 704 | }else { |
| 705 | args->addr = NULL; |
| 706 | args->addrlen = NULL; |
| 707 | } |
| 708 | |
| 709 | args->fd = fd; |
| 710 | |
| 711 | SYSCALL(FF_SO_ACCEPT, args); |
| 712 | |
| 713 | if (ret > 0) { |
| 714 | ret = convert_fstack_fd(ret); |
| 715 | } |
| 716 | |
| 717 | if (addr) { |
| 718 | if (ret > 0) { |
| 719 | socklen_t cplen = *sh_addrlen > *addrlen ? |
nothing calls this directly
no test coverage detected