mirror of
https://github.com/freebsd/freebsd-src.git
synced 2026-10-28 11:25:21 +01:00
iuserboot: bump the interface to v6, add an accept_interpreter callback
If an explicit loader wasn't requested, then bhyveload(8) maintains a
/boot handle that it can use for swapping to a different flavor. This
means that we expose all of the host /boot to the sandbox for the
duration of script execution.
Add a callback to ack that we're OK with the interpreter so that
bhyveload(8) can release the bootfd. This is worth doing because it's
prior to guest script execution, so we're still running a reasonably
untainted process.
Reviewed by: imp, jhb
(cherry picked from commit 619d092177)
This commit is contained in:
1 parent
5245187af2
commit
84ec2d3b67
3 files changed
+32
-5
No files matched your search
@@ -46,6 +46,13 @@
|
||||
*/
|
||||
#define USERBOOT_VERSION_5 5
|
||||
|
||||
/*
|
||||
* Version 6 added a callback for indicating that the guest
|
||||
* is OK with the existing interpreter, so the host can close associated
|
||||
* resources. The callback structure is still backward compatible.
|
||||
*/
|
||||
#define USERBOOT_VERSION_6 6
|
||||
|
||||
/*
|
||||
* Exit codes from the loader
|
||||
*/
|
||||
@@ -225,4 +232,9 @@ struct loader_callbacks {
|
||||
* Version 5 addition.
|
||||
*/
|
||||
void (*swap_interpreter)(void *arg, const char *interp);
|
||||
|
||||
/*
|
||||
* Version 6 addition.
|
||||
*/
|
||||
void (*accept_interpreter)(void *arg);
|
||||
};
|
||||
@@ -217,6 +217,8 @@ loader_main(struct loader_callbacks *cb, void *arg, int version, int ndisks)
|
||||
*/
|
||||
if (version >= USERBOOT_VERSION_5)
|
||||
check_interpreter();
|
||||
if (version >= USERBOOT_VERSION_6)
|
||||
CALLBACK(accept_interpreter);
|
||||
|
||||
if (setjmp(jb))
|
||||
return;
|
||||
|
||||
@@ -102,6 +102,7 @@ enum {
|
||||
static struct termios term, oldterm;
|
||||
static int disk_fd[NDISKS];
|
||||
static int ndisks;
|
||||
static int bootfd = -1;
|
||||
static int consin_fd, consout_fd;
|
||||
static int hostbase_fd = -1;
|
||||
|
||||
@@ -652,6 +653,16 @@ cb_swap_interpreter(void *arg __unused, const char *interp_req)
|
||||
longjmp(jb, JMP_SWAPLOADER);
|
||||
}
|
||||
|
||||
static void
|
||||
cb_accept_interpreter(void *arg __unused)
|
||||
{
|
||||
if (bootfd == -1)
|
||||
return;
|
||||
|
||||
close(bootfd);
|
||||
bootfd = -1;
|
||||
}
|
||||
|
||||
static struct loader_callbacks cb = {
|
||||
.getc = cb_getc,
|
||||
.putc = cb_putc,
|
||||
@@ -689,6 +700,9 @@ static struct loader_callbacks cb = {
|
||||
|
||||
/* Version 5 additions */
|
||||
.swap_interpreter = cb_swap_interpreter,
|
||||
|
||||
/* Version 6 additions */
|
||||
.accept_interpreter = cb_accept_interpreter,
|
||||
};
|
||||
|
||||
static int
|
||||
@@ -790,7 +804,7 @@ hostbase_open(const char *base)
|
||||
}
|
||||
|
||||
static void
|
||||
loader_open(int bootfd)
|
||||
loader_open(void)
|
||||
{
|
||||
int fd;
|
||||
|
||||
@@ -820,9 +834,8 @@ main(int argc, char** argv)
|
||||
{
|
||||
void (*func)(struct loader_callbacks *, void *, int, int);
|
||||
uint64_t mem_size;
|
||||
int bootfd, opt, error, memflags, need_reinit;
|
||||
int opt, error, memflags, need_reinit;
|
||||
|
||||
bootfd = -1;
|
||||
progname = basename(argv[0]);
|
||||
|
||||
memflags = 0;
|
||||
@@ -950,7 +963,7 @@ main(int argc, char** argv)
|
||||
if (error)
|
||||
err(1, "vm_setup_memory");
|
||||
|
||||
loader_open(bootfd);
|
||||
loader_open();
|
||||
func = dlsym(loader_hdl, "loader_main");
|
||||
if (!func)
|
||||
errx(1, "dlsym: %s", dlerror());
|
||||
@@ -965,7 +978,7 @@ main(int argc, char** argv)
|
||||
addenv("smbios.bios.vendor=BHYVE");
|
||||
addenv("boot_serial=1");
|
||||
|
||||
func(&cb, NULL, USERBOOT_VERSION_5, ndisks);
|
||||
func(&cb, NULL, USERBOOT_VERSION_6, ndisks);
|
||||
|
||||
free(loader);
|
||||
return (0);
|
||||
|
||||
Reference in new issue
Block a user