Re: git: b44cc1b479fe - main - loader: do not try to open directories with TFTP

From: A FreeBSD User <freebsd_at_walstatt-de.de>
Date: Thu, 21 Aug 2025 04:12:17 UTC
Am Tage des Herren Wed, 20 Aug 2025 22:48:38 GMT
"Simon J. Gerraty" <sjg@FreeBSD.org> schrieb:

> The branch main has been updated by sjg:
> 
> URL: https://cgit.FreeBSD.org/src/commit/?id=b44cc1b479fefc8570611309c3f5a6966fb26e3b
> 
> commit b44cc1b479fefc8570611309c3f5a6966fb26e3b
> Author:     Simon J. Gerraty <sjg@FreeBSD.org>
> AuthorDate: 2025-08-20 22:45:54 +0000
> Commit:     Simon J. Gerraty <sjg@FreeBSD.org>
> CommitDate: 2025-08-20 22:45:54 +0000
> 
>     loader: do not try to open directories with TFTP
>     
>     Attempting to mount or even open / with some tftp servers
>     causes a several minute delay in boot.
>     
>     Since opening a directory via TFTP does not make sense, we
>     avoid it.  We don't know if using TFTP until after net_open()
>     has been called.
>     
>     Add an is_tftp() accessor to avoid everyone having to include
>     all the net* headers.
>     
>     Sponsored by:   Juniper Networks, Inc.
>     Differential Revision:  https://reviews.freebsd.org/D51447
> ---
>  stand/common/dev_net.c | 9 ++++++++-
>  stand/libsa/mount.c    | 5 ++++-
>  stand/libsa/open.c     | 8 ++++++++
>  stand/libsa/stand.h    | 3 +++
>  4 files changed, 23 insertions(+), 2 deletions(-)
> 
> diff --git a/stand/common/dev_net.c b/stand/common/dev_net.c
> index 964fa514cac5..10389db27b99 100644
> --- a/stand/common/dev_net.c
> +++ b/stand/common/dev_net.c
> @@ -182,6 +182,7 @@ net_open(struct open_file *f, ...)
>  			setenv("boot.netif.mtu", mtu, 1);
>  		}
>  
> +		DEBUG_PRINTF(1,("%s: netproto=%d\n", __func__, netproto));
>  	}
>  	netdev_opens++;
>  	dev->d_opendata = &netdev_sock;
> @@ -193,7 +194,7 @@ net_close(struct open_file *f)
>  {
>  	struct devdesc *dev;
>  
> -	DEBUG_PRINTF(1,("%s: opens=%d\n", __func__, netdev_opens));
> +	DEBUG_PRINTF(2,("%s: opens=%d\n", __func__, netdev_opens));
>  
>  	dev = f->f_devdata;
>  	dev->d_opendata = NULL;
> @@ -344,6 +345,12 @@ net_print(int verbose)
>  	return (ret);
>  }
>  
> +bool
> +is_tftp(void)
> +{
> +    return (netproto == NET_TFTP);
> +}
> +
>  /*
>   * Parses the rootpath if present
>   *
> diff --git a/stand/libsa/mount.c b/stand/libsa/mount.c
> index 73bf6ab8118c..c866dc9c7055 100644
> --- a/stand/libsa/mount.c
> +++ b/stand/libsa/mount.c
> @@ -107,7 +107,10 @@ mount(const char *dev, const char *path, int flags __unused, void *data)
>  		fs = file_system[i];
>  		if (fs->fo_mount == NULL)
>  			continue;
> -
> +		DEBUG_PRINTF(1,("%s: fs=%s path=%s\n",
> +			__func__, fs->fs_name, path));
> +		if (is_tftp())
> +			break;
>  		if (fs->fo_mount(dev, path, &data) != 0)
>  			continue;
>  
> diff --git a/stand/libsa/open.c b/stand/libsa/open.c
> index c97aa5977f9e..91848aca7dbe 100644
> --- a/stand/libsa/open.c
> +++ b/stand/libsa/open.c
> @@ -138,6 +138,8 @@ open(const char *fname, int mode)
>  	struct fs_ops *fs;
>  	struct open_file *f;
>  	int fd, i, error, besterror;
> +	bool is_dir;
> +	size_t n;
>  	const char *file;
>  
>  	TSENTER();
> @@ -182,8 +184,14 @@ open(const char *fname, int mode)
>  
>  	/* pass file name to the different filesystem open routines */
>  	besterror = ENOENT;
> +	n = strlen(file);
> +	is_dir = (n > 0 && file[n - 1] == '/');
>  	for (i = 0; file_system[i] != NULL; i++) {
>  		fs = file_system[i];
> +		if (is_dir && is_tftp()) {
> +			error = EOPNOTSUPP;
> +			goto err;
> +		}
>  		error = (fs->fo_open)(file, f);
>  		if (error == 0)
>  			goto ok;
> diff --git a/stand/libsa/stand.h b/stand/libsa/stand.h
> index c6a08be2f7e3..233d11ab3ecb 100644
> --- a/stand/libsa/stand.h
> +++ b/stand/libsa/stand.h
> @@ -507,6 +507,9 @@ extern void *reallocf(void *, size_t);
>   */
>  caddr_t ptov(uintptr_t);
>  
> +/* dev_net.c */
> +bool is_tftp(void);
> +
>  /* features.c */
>  typedef void (feature_iter_fn)(void *, const char *, const char *, bool);
>  
> 

Build of world/kernel fails with the error below:

[...]

--- all_subdir_stand/i386 ---
--- all_subdir_stand/i386/gptzfsboot ---
ld: error: undefined symbol: is_tftp
>>> referenced by open.c
>>>               open.o:(open) in archive /usr/obj/usr/src/amd64.amd64/stand/libsa32/libsa32.a
>>> referenced by mount.c
>>>               mount.o:(mount) in archive
>>> /usr/obj/usr/src/amd64.amd64/stand/libsa32/libsa32.a
--- all_subdir_usr.sbin ---
-function -Wno-enum-conversion -Wno-unused-local-typedef -Wno-address-of-packed-member
-Qunused-arguments      -c /usr/src/contrib/tcpdump/print-ntp.c -o print-ntp.pieo ---
all_subdir_stand --- *** [gptzfsboot.out] Error code 1

-- 

A FreeBSD user