From 804b2f7a0f500bd81a3083df4d094f527c8682db Mon Sep 17 00:00:00 2001 From: "Michael I. Bushnell" Date: Tue, 23 Apr 1996 15:04:59 +0000 Subject: (diskfs_S_ifsock_getsockaddr): Request notification for new SOCKADDR; count that notification as a reference. --- libdiskfs/ifsock.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'libdiskfs') diff --git a/libdiskfs/ifsock.c b/libdiskfs/ifsock.c index b7df10cf..2b02554b 100644 --- a/libdiskfs/ifsock.c +++ b/libdiskfs/ifsock.c @@ -1,5 +1,5 @@ /* Implement ifsock inteface - Copyright (C) 1994 Free Software Foundation + Copyright (C) 1994, 1996 Free Software Foundation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -56,6 +56,7 @@ diskfs_S_ifsock_getsockaddr (struct protid *cred, { mach_port_t server; mach_port_t sockaddr; + mach_port_t old; mutex_unlock (&np->lock); @@ -111,7 +112,20 @@ diskfs_S_ifsock_getsockaddr (struct protid *cred, /* Someone beat us */ mach_port_deallocate (mach_task_self (), sockaddr); else - np->sockaddr = sockaddr; + { + /* The receive right of the sockaddr holds a reference; + when we get a dead name on that right we drop our + reference. */ + mach_port_request_notification (mach_task_self (), sockaddr, + MACH_NOTIFY_DEAD_NAME, 1, + np->pi.port_right, + MACH_PORT_MAKE_SEND_ONCE, + &old); + if (old != MACH_PORT_NULL) + mach_port_deallocate (mach_task_self (), old); + np->sockaddr = sockaddr; + diskfs_nref (np); + } } *address = np->sockaddr; -- cgit v1.2.3