[PATCH 1/1] ifupdown: add write lock around ifstate access

David Henderson dhenderson at digital-pipe.com
Thu Sep 29 12:53:45 UTC 2016


Awesome, thanks Danomi!

Dave


On 9/28/16, Danomi Manchego <danomimanchego123 at gmail.com> wrote:
> So that concurrent access on systems with multiple
> network interfaces correctly update the ifstate file.
>
> Signed-off-by: Danomi Manchego <danomimanchego123 at gmail.com>
> ---
>  networking/ifupdown.c | 31 +++++++++++++++++++++++++++++++
>  1 file changed, 31 insertions(+)
>
> diff --git a/networking/ifupdown.c b/networking/ifupdown.c
> index b0bc0d7..1902c42 100644
> --- a/networking/ifupdown.c
> +++ b/networking/ifupdown.c
> @@ -1196,6 +1196,29 @@ static llist_t *find_iface_state(llist_t *state_list,
> const char *iface)
>  	return NULL;
>  }
>
> +static FILE *open_ifstate_lock_file(void)
> +{
> +	FILE *fp = fopen_for_write("/var/lock/ifupdown.lock");
> +
> +	if (fp) {
> +		struct flock fl;
> +		fl.l_type = F_WRLCK;
> +		fl.l_whence = SEEK_SET;
> +		fl.l_start = 0;
> +		fl.l_len = 0;
> +		fcntl(fileno(fp), F_SETLKW, &fl);
> +	}
> +
> +	return fp;
> +}
> +
> +static void close_ifstate_lock_file(FILE *fp)
> +{
> +	if (fp) {
> +		fclose(fp);
> +	}
> +}
> +
>  /* read the previous state from the state file */
>  static llist_t *read_iface_state(void)
>  {
> @@ -1276,9 +1299,14 @@ int ifupdown_main(int argc UNUSED_PARAM, char
> **argv)
>  		}
>
>  		if (!FORCE) {
> +
> +			FILE *state_lock_fp = open_ifstate_lock_file();
> +
>  			llist_t *state_list = read_iface_state();
>  			const llist_t *iface_state = find_iface_state(state_list, iface);
>
> +			close_ifstate_lock_file(state_lock_fp);
> +
>  			if (cmds == iface_up) {
>  				/* ifup */
>  				if (iface_state) {
> @@ -1348,6 +1376,7 @@ int ifupdown_main(int argc UNUSED_PARAM, char **argv)
>  			any_failures = 1;
>  		} else if (!NO_ACT) {
>  			/* update the state file */
> +			FILE *state_lock_fp = open_ifstate_lock_file();
>  			FILE *state_fp;
>  			llist_t *state;
>  			llist_t *state_list = read_iface_state();
> @@ -1378,6 +1407,8 @@ int ifupdown_main(int argc UNUSED_PARAM, char **argv)
>  			}
>  			fclose(state_fp);
>  			llist_free(state_list, free);
> +
> +			close_ifstate_lock_file(state_lock_fp);
>  		}
>   next:
>  		free(iface);
> --
> 1.9.1
>
> _______________________________________________
> busybox mailing list
> busybox at busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
>


More information about the busybox mailing list