1
0
mirror of https://git.FreeBSD.org/src.git synced 2025-01-18 15:30:21 +00:00

Eliminate duplicated code and struct member definitions in the handoff

of args data between gptboot/zfsboot and loader(8).

Despite what seems like a lot of changes here, there are no actual
changes in behavior, or in the data layout in the structures involved.
This is just eliminating identical code pasted into multiple locations.

In detail, the changes are...

- Move struct zfs_boot_args definition from libsa/zfs/libzfs.h to
  i386/common/bootargs.h because it is specific to x86 booting and the
  handoff between zfsboot and loader, and has no relation to the zfs
  library code in general.

- The geli_boot_args and zfs_boot_args structs both contain an identical
  set of member variables containing geli information.  Extract this out
  to a new geli_boot_data struct, and embed it in the arg-passing structs.

- Provide new routines geli_import_boot_data() and geli_export_boot_data()
  that can be shared between gptboot, zfsboot, and loader instead of
  pasting identical code into several different .c files.

- Remove some checks for a NULL pointer that can never be true because the
  pointer being tested was set using pointer math (kargs + 1) and that can
  never result in NULL in this code.
This commit is contained in:
Ian Lepore 2018-12-03 03:58:30 +00:00
parent e860439466
commit df108aafe9
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=341420
5 changed files with 55 additions and 59 deletions

View File

@ -84,11 +84,15 @@ struct bootargs
#ifdef LOADER_GELI_SUPPORT
#include <crypto/intake.h>
#include "geliboot.h"
#endif
struct geli_boot_args
/*
* geli_boot_data is embedded in geli_boot_args (passed from gptboot to loader)
* and in zfs_boot_args (passed from zfsboot and gptzfsboot to loader).
*/
struct geli_boot_data
{
uint32_t size;
union {
char gelipw[256];
struct {
@ -106,6 +110,49 @@ struct geli_boot_args
};
};
#ifdef LOADER_GELI_SUPPORT
static inline void
export_geli_boot_data(struct geli_boot_data *gbdata)
{
gbdata->notapw = '\0';
gbdata->keybuf_sentinel = KEYBUF_SENTINEL;
gbdata->keybuf = malloc(sizeof(struct keybuf) +
(GELI_MAX_KEYS * sizeof(struct keybuf_ent)));
geli_export_key_buffer(gbdata->keybuf);
}
static inline void
import_geli_boot_data(struct geli_boot_data *gbdata)
{
if (gbdata->gelipw[0] != '\0') {
setenv("kern.geom.eli.passphrase", gbdata->gelipw, 1);
explicit_bzero(gbdata->gelipw, sizeof(gbdata->gelipw));
} else if (gbdata->keybuf_sentinel == KEYBUF_SENTINEL) {
geli_import_key_buffer(gbdata->keybuf);
}
}
#endif /* LOADER_GELI_SUPPORT */
struct geli_boot_args
{
uint32_t size;
struct geli_boot_data gelidata;
};
struct zfs_boot_args
{
uint32_t size;
uint32_t reserved;
uint64_t pool;
uint64_t root;
uint64_t primary_pool;
uint64_t primary_vdev;
struct geli_boot_data gelidata;
};
#endif /*__ASSEMBLER__*/
#endif /* !_BOOT_I386_ARGS_H_ */

View File

@ -114,7 +114,6 @@ static int vdev_read(void *vdev __unused, void *priv, off_t off, void *buf,
#ifdef LOADER_GELI_SUPPORT
#include "geliboot.h"
static char gelipw[GELI_PW_MAXLEN];
static struct keybuf *gelibuf;
#endif
struct gptdsk {
@ -480,12 +479,7 @@ load(void)
#ifdef LOADER_GELI_SUPPORT
geliargs.size = sizeof(geliargs);
explicit_bzero(gelipw, sizeof(gelipw));
gelibuf = malloc(sizeof(struct keybuf) +
(GELI_MAX_KEYS * sizeof(struct keybuf_ent)));
geli_export_key_buffer(gelibuf);
geliargs.notapw = '\0';
geliargs.keybuf_sentinel = KEYBUF_SENTINEL;
geliargs.keybuf = gelibuf;
export_geli_boot_data(&geliargs.gelidata);
#endif
/*
* Note that the geliargs struct is passed by value, not by pointer.

View File

@ -172,15 +172,8 @@ main(void)
#ifdef LOADER_GELI_SUPPORT
if ((kargs->bootflags & KARGS_FLAGS_EXTARG) != 0) {
zargs = (struct zfs_boot_args *)(kargs + 1);
if (zargs != NULL && zargs->size >= offsetof(struct zfs_boot_args, gelipw)) {
if (zargs->size >= offsetof(struct zfs_boot_args, keybuf_sentinel) &&
zargs->keybuf_sentinel == KEYBUF_SENTINEL) {
geli_import_key_buffer(zargs->keybuf);
}
if (zargs->gelipw[0] != '\0') {
setenv("kern.geom.eli.passphrase", zargs->gelipw, 1);
explicit_bzero(zargs->gelipw, sizeof(zargs->gelipw));
}
if (zargs->size > offsetof(struct zfs_boot_args, gelidata)) {
import_geli_boot_data(&zargs->gelidata);
}
}
#endif /* LOADER_GELI_SUPPORT */
@ -188,14 +181,8 @@ main(void)
#ifdef LOADER_GELI_SUPPORT
if ((kargs->bootflags & KARGS_FLAGS_EXTARG) != 0) {
gargs = (struct geli_boot_args *)(kargs + 1);
if (gargs != NULL && gargs->size >= offsetof(struct geli_boot_args, gelipw)) {
if (gargs->keybuf_sentinel == KEYBUF_SENTINEL) {
geli_import_key_buffer(gargs->keybuf);
}
if (gargs->gelipw[0] != '\0') {
setenv("kern.geom.eli.passphrase", gargs->gelipw, 1);
explicit_bzero(gargs->gelipw, sizeof(gargs->gelipw));
}
if (gargs->size >= offsetof(struct geli_boot_args, gelidata)) {
import_geli_boot_data(&gargs->gelidata);
}
}
#endif /* LOADER_GELI_SUPPORT */

View File

@ -129,7 +129,6 @@ int main(void);
#ifdef LOADER_GELI_SUPPORT
#include "geliboot.h"
static char gelipw[GELI_PW_MAXLEN];
static struct keybuf *gelibuf;
#endif
struct zfsdsk {
@ -993,13 +992,7 @@ load(void)
zfsargs.primary_pool = primary_spa->spa_guid;
#ifdef LOADER_GELI_SUPPORT
explicit_bzero(gelipw, sizeof(gelipw));
gelibuf = malloc(sizeof(struct keybuf) + (GELI_MAX_KEYS * sizeof(struct keybuf_ent)));
geli_export_key_buffer(gelibuf);
zfsargs.notapw = '\0';
zfsargs.keybuf_sentinel = KEYBUF_SENTINEL;
zfsargs.keybuf = gelibuf;
#else
zfsargs.gelipw[0] = '\0';
export_geli_boot_data(&zfsargs.gelidata);
#endif
if (primary_vdev != NULL)
zfsargs.primary_vdev = primary_vdev->v_guid;

View File

@ -44,31 +44,6 @@ struct zfs_devdesc {
#include <crypto/intake.h>
#endif
struct zfs_boot_args
{
uint32_t size;
uint32_t reserved;
uint64_t pool;
uint64_t root;
uint64_t primary_pool;
uint64_t primary_vdev;
union {
char gelipw[256];
struct {
char notapw; /*
* single null byte to stop keybuf
* being interpreted as a password
*/
uint32_t keybuf_sentinel;
#ifdef LOADER_GELI_SUPPORT
struct keybuf *keybuf;
#else
void *keybuf;
#endif
};
};
};
int zfs_parsedev(struct zfs_devdesc *dev, const char *devspec,
const char **path);
char *zfs_fmtdev(void *vdev);