On 2/7/19 9:30 AM, Al Viro wrote:
> On Thu, Feb 07, 2019 at 09:14:41AM -0700, Jens Axboe wrote:
> 
>> I created a small app to do just that, and ran it and verified that
>> ->release() is called and the io_uring is released as expected. This
>> is run on the current -git branch, which has a socket backing for
>> the io_uring fd itself, but not for the registered files.
>>
>> What am I missing here? Attaching the program as a reference.
> 
>> int main(int argc, char *argv[])
>> {
>>      int sp[2], pid, ring_fd, ret;
>>
>>      if (socketpair(AF_UNIX, SOCK_DGRAM, 0, sp) != 0) {
>>              perror("Failed to create Unix-domain socket pair\n");
>>              return 1;
>>      }
>>
>>      ring_fd = get_ring_fd();
>>      if (ring_fd < 0)
>>              return 1;
>>
>>      ret = io_uring_register_files(ring_fd, sp[0], sp[1]);
>>      if (ret < 0) {
>>              perror("register files");
>>              return 1;
>>      }
>>
>>      pid = fork();
>>      if (pid) {
>>              printf("Sending fd %d\n", ring_fd);
>>
>>              send_fd(sp[0], ring_fd);
>>      } else {
>>              int fd;
>>
>>              fd = recv_fd(sp[1]);
> 
> Well, yes - once you receive it, you obviously have no references
> sitting in SCM_RIGHTS anymore.
> 
> Get rid of recv_fd() there (along with fork(), while we are at it - what's
> it for?) and just do send_fd + these 3 close (or just exit, for that matter).

Ah got it, yes you are right, that does leak.

Thanks for the other (very) detailed note, I'll add a socket backing for the
registered files. I'll respond to the other details in there a bit later.

-- 
Jens Axboe

Reply via email to