/etc/rc.d locking devd.pid (was Re: Restarting devd)

Warren Block wblock at wonkity.com
Sun Oct 18 23:12:13 UTC 2009


On Mon, 19 Oct 2009, Kostik Belousov wrote:
>>
>> ...and this is due to dhclient, run from /etc/rc.d at startup, locking
>> /var/run/devd.pid:
>>
>> lightning% lsof /var/run/devd.pid
>> COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF  NODE NAME
>> devd      400  root    6w  VREG  0,101        3 47124 /var/run/devd.pid
>> dhclient  865  root    6w  VREG  0,101        3 47124 /var/run/devd.pid
>> dhclient 1024 _dhcp    6w  VREG  0,101        3 47124 /var/run/devd.pid
>>
>> This is a regression from 7-STABLE, where devd.pid is only locked by
>> devd after startup.
>
> Devd forks to spawn dhclient, it seems, and opened file descriptor for
> the lock file is leaking to the child. Since pidfile(3) uses flock(2),
> the lock survives devd death.
>
> I think that this is a generic issue with pidfile/fork interaction.
> It is not obvious whether setting FD_CLOEXEC flag is right thing to
> do there.
>
> Anyway, please test.
>
> diff --git a/lib/libutil/flopen.c b/lib/libutil/flopen.c
> index 754c9c0..a5e436e 100644
> --- a/lib/libutil/flopen.c
> +++ b/lib/libutil/flopen.c
> @@ -100,6 +100,12 @@ flopen(const char *path, int flags, ...)
> 			errno = serrno;
> 			return (-1);
> 		}
> +		if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0) {
> +			serrno = errno;
> +			(void)close(fd);
> +			errno = serrno;
> +			return (-1);
> +		}
> 		return (fd);
> 	}
> }

The dhclient locks are still present with this code.  I just did make; 
make install in /usr/src/lib/libutil and rebooted to test.

-Warren Block * Rapid City, South Dakota USA


More information about the freebsd-current mailing list