summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/geom/part/g_part.c4
-rw-r--r--sys/geom/part/g_part_gpt.c7
-rw-r--r--sys/geom/part/g_part_mbr.c7
-rw-r--r--sys/geom/part/g_part_pc98.c7
4 files changed, 20 insertions, 5 deletions
diff --git a/sys/geom/part/g_part.c b/sys/geom/part/g_part.c
index 71c0b05..ad84956 100644
--- a/sys/geom/part/g_part.c
+++ b/sys/geom/part/g_part.c
@@ -535,8 +535,8 @@ g_part_ctl_bootcode(struct gctl_req *req, struct g_part_parms *gpp)
error = ENODEV;
goto fail;
}
- if (gpp->gpp_codesize != sz) {
- error = EINVAL;
+ if (gpp->gpp_codesize > sz) {
+ error = EFBIG;
goto fail;
}
diff --git a/sys/geom/part/g_part_gpt.c b/sys/geom/part/g_part_gpt.c
index 7bdfa07..13a4561 100644
--- a/sys/geom/part/g_part_gpt.c
+++ b/sys/geom/part/g_part_gpt.c
@@ -374,9 +374,14 @@ static int
g_part_gpt_bootcode(struct g_part_table *basetable, struct g_part_parms *gpp)
{
struct g_part_gpt_table *table;
+ size_t codesz;
+ codesz = DOSPARTOFF;
table = (struct g_part_gpt_table *)basetable;
- bcopy(gpp->gpp_codeptr, table->mbr, DOSPARTOFF);
+ bzero(table->mbr, codesz);
+ codesz = MIN(codesz, gpp->gpp_codesize);
+ if (codesz > 0)
+ bcopy(gpp->gpp_codeptr, table->mbr, codesz);
return (0);
}
diff --git a/sys/geom/part/g_part_mbr.c b/sys/geom/part/g_part_mbr.c
index 9e3e809..b0ba323 100644
--- a/sys/geom/part/g_part_mbr.c
+++ b/sys/geom/part/g_part_mbr.c
@@ -213,9 +213,14 @@ static int
g_part_mbr_bootcode(struct g_part_table *basetable, struct g_part_parms *gpp)
{
struct g_part_mbr_table *table;
+ size_t codesz;
+ codesz = DOSPARTOFF;
table = (struct g_part_mbr_table *)basetable;
- bcopy(gpp->gpp_codeptr, table->mbr, DOSPARTOFF);
+ bzero(table->mbr, codesz);
+ codesz = MIN(codesz, gpp->gpp_codesize);
+ if (codesz > 0)
+ bcopy(gpp->gpp_codeptr, table->mbr, codesz);
return (0);
}
diff --git a/sys/geom/part/g_part_pc98.c b/sys/geom/part/g_part_pc98.c
index 2b997bc..f0f1474 100644
--- a/sys/geom/part/g_part_pc98.c
+++ b/sys/geom/part/g_part_pc98.c
@@ -209,9 +209,14 @@ static int
g_part_pc98_bootcode(struct g_part_table *basetable, struct g_part_parms *gpp)
{
struct g_part_pc98_table *table;
+ size_t codesz;
+ codesz = DOSMAGICOFFSET;
table = (struct g_part_pc98_table *)basetable;
- bcopy(gpp->gpp_codeptr, table->boot, DOSMAGICOFFSET);
+ bzero(table->boot, codesz);
+ codesz = MIN(codesz, gpp->gpp_codesize);
+ if (codesz > 0)
+ bcopy(gpp->gpp_codeptr, table->boot, codesz);
return (0);
}
OpenPOWER on IntegriCloud