mirror of
https://github.com/opnsense/src.git
synced 2026-04-15 14:29:58 -04:00
Change the way how we update bootcode for BSD scheme.
Since the only parameter that we check is size of bootcode, then allow only two sizes: size of boot1 and size of /boot/boot. This partially protects users from losing ability to boot if incorrect bootcode is specified. Requested by: ru
This commit is contained in:
parent
a834836d83
commit
503e6682cd
1 changed files with 12 additions and 13 deletions
|
|
@ -46,6 +46,11 @@ __FBSDID("$FreeBSD$");
|
|||
|
||||
#include "g_part_if.h"
|
||||
|
||||
#define BOOT1_SIZE 512
|
||||
#define LABEL_SIZE 512
|
||||
#define BOOT2_OFF (BOOT1_SIZE + LABEL_SIZE)
|
||||
#define BOOT2_SIZE (BBSIZE - BOOT2_OFF)
|
||||
|
||||
FEATURE(geom_part_bsd, "GEOM partitioning class for BSD disklabels");
|
||||
|
||||
struct g_part_bsd_table {
|
||||
|
|
@ -170,22 +175,16 @@ g_part_bsd_bootcode(struct g_part_table *basetable, struct g_part_parms *gpp)
|
|||
{
|
||||
struct g_part_bsd_table *table;
|
||||
const u_char *codeptr;
|
||||
size_t hdsz, tlsz;
|
||||
size_t codesz, tlofs;
|
||||
|
||||
hdsz = 512;
|
||||
tlofs = hdsz + 148 + basetable->gpt_entries * 16;
|
||||
tlsz = BBSIZE - tlofs;
|
||||
if (gpp->gpp_codesize != BOOT1_SIZE && gpp->gpp_codesize != BBSIZE)
|
||||
return (ENODEV);
|
||||
|
||||
table = (struct g_part_bsd_table *)basetable;
|
||||
bzero(table->bbarea, hdsz);
|
||||
bzero(table->bbarea + tlofs, tlsz);
|
||||
codeptr = gpp->gpp_codeptr;
|
||||
codesz = MIN(hdsz, gpp->gpp_codesize);
|
||||
if (codesz > 0)
|
||||
bcopy(codeptr, table->bbarea, codesz);
|
||||
codesz = MIN(tlsz, gpp->gpp_codesize - tlofs);
|
||||
if (codesz > 0)
|
||||
bcopy(codeptr + tlofs, table->bbarea + tlofs, codesz);
|
||||
bcopy(codeptr, table->bbarea, BOOT1_SIZE);
|
||||
if (gpp->gpp_codesize == BBSIZE)
|
||||
bcopy(codeptr + BOOT2_OFF, table->bbarea + BOOT2_OFF,
|
||||
BOOT2_SIZE);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue