loader: net_open() should not replace f->f_devdata

net_open() does replace f_devdata with pointer to netdev_sock,
this will cause memory leak when device is closed, but also does
alter the devopen() logic.

We should store &netdev_sock to dev->d_opendata instead, this
would preserve and follow the devopen() logic.

Fixes network boot on aarch64 (tested by bz).

Reviewed-by:	imp
MFC After:	2 weeks
Differential Revision: https://reviews.freebsd.org/D32227
This commit is contained in:
Toomas Soome 2021-09-24 18:04:31 +03:00
parent bcd4c17cca
commit 98e805b4a1
3 changed files with 13 additions and 6 deletions

View File

@ -114,7 +114,7 @@ net_init(void)
/*
* Called by devopen after it sets f->f_dev to our devsw entry.
* This opens the low-level device and sets f->f_devdata.
* This opens the low-level device and sets dev->d_opendata.
* This is declared with variable arguments...
*/
static int
@ -193,20 +193,22 @@ net_open(struct open_file *f, ...)
}
netdev_opens++;
f->f_devdata = &netdev_sock;
dev->d_opendata = &netdev_sock;
return (error);
}
static int
net_close(struct open_file *f)
{
struct devdesc *dev;
#ifdef NETIF_DEBUG
if (debug)
printf("%s: opens=%d\n", __func__, netdev_opens);
#endif
f->f_devdata = NULL;
dev = f->f_devdata;
dev->d_opendata = NULL;
return (0);
}

View File

@ -464,6 +464,7 @@ nfs_readdata(struct nfs_iodesc *d, off_t off, void *addr, size_t len)
int
nfs_open(const char *upath, struct open_file *f)
{
struct devdesc *dev;
struct iodesc *desc;
struct nfs_iodesc *currfd = NULL;
char buf[2 * NFS_V3MAXFHSIZE + 3];
@ -484,6 +485,7 @@ nfs_open(const char *upath, struct open_file *f)
if (netproto != NET_NFS)
return (EINVAL);
dev = f->f_devdata;
#ifdef NFS_DEBUG
if (debug)
printf("nfs_open: %s (rootip=%s rootpath=%s)\n", upath,
@ -497,7 +499,7 @@ nfs_open(const char *upath, struct open_file *f)
if (f->f_dev->dv_type != DEVT_NET)
return (EINVAL);
if (!(desc = socktodesc(*(int *)(f->f_devdata))))
if (!(desc = socktodesc(*(int *)(dev->d_opendata))))
return (EINVAL);
/* Bind to a reserved port. */

View File

@ -37,7 +37,8 @@ __FBSDID("$FreeBSD$");
/*
* Simple TFTP implementation for libsa.
* Assumes:
* - socket descriptor (int) at open_file->f_devdata
* - socket descriptor (int) at dev->d_opendata, dev stored at
* open_file->f_devdata
* - server host IP in global rootip
* Restrictions:
* - read only
@ -432,6 +433,7 @@ tftp_getnextblock(struct tftp_handle *h)
static int
tftp_open(const char *path, struct open_file *f)
{
struct devdesc *dev;
struct tftp_handle *tftpfile;
struct iodesc *io;
int res;
@ -452,7 +454,8 @@ tftp_open(const char *path, struct open_file *f)
return (ENOMEM);
tftpfile->tftp_blksize = TFTP_REQUESTED_BLKSIZE;
tftpfile->iodesc = io = socktodesc(*(int *)(f->f_devdata));
dev = f->f_devdata;
tftpfile->iodesc = io = socktodesc(*(int *)(dev->d_opendata));
if (io == NULL) {
free(tftpfile);
return (EINVAL);