aboutsummaryrefslogtreecommitdiff
path: root/sys/geom
diff options
context:
space:
mode:
authorZhenlei Huang <zlei.huang@gmail.com>2022-10-18 15:03:02 +0000
committerMark Johnston <markj@FreeBSD.org>2022-10-18 15:03:02 +0000
commit5be5d0d5cb2657d7668f4ca0f8543198cf8d759b (patch)
tree1b3d3d15471dfb34cf34c0534bdd21f012d7df08 /sys/geom
parent3467e28f3d114f35bdfa87d6afd373f9d291dfb3 (diff)
Diffstat (limited to 'sys/geom')
-rw-r--r--sys/geom/part/g_part_gpt.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/sys/geom/part/g_part_gpt.c b/sys/geom/part/g_part_gpt.c
index 0c472e5ebba6..cd04fe714fbe 100644
--- a/sys/geom/part/g_part_gpt.c
+++ b/sys/geom/part/g_part_gpt.c
@@ -85,6 +85,7 @@ enum gpt_state {
GPT_STATE_MISSING, /* No signature found. */
GPT_STATE_CORRUPT, /* Checksum mismatch. */
GPT_STATE_INVALID, /* Nonconformant/invalid. */
+ GPT_STATE_UNSUPPORTED, /* Not supported. */
GPT_STATE_OK /* Perfectly fine. */
};
@@ -148,6 +149,8 @@ static kobj_method_t g_part_gpt_methods[] = {
{ 0, 0 }
};
+#define MAXENTSIZE 1024
+
static struct g_part_scheme g_part_gpt_scheme = {
"GPT",
g_part_gpt_methods,
@@ -548,6 +551,11 @@ gpt_read_tbl(struct g_part_gpt_table *table, struct g_consumer *cp,
if (hdr == NULL)
return (NULL);
+ if (hdr->hdr_entries > g_part_gpt_scheme.gps_maxent ||
+ hdr->hdr_entsz > MAXENTSIZE) {
+ table->state[elt] = GPT_STATE_UNSUPPORTED;
+ return (NULL);
+ }
pp = cp->provider;
table->lba[elt] = hdr->hdr_lba_table;
@@ -961,10 +969,25 @@ g_part_gpt_read(struct g_part_table *basetable, struct g_consumer *cp)
/* Fail if we haven't got any good tables at all. */
if (table->state[GPT_ELT_PRITBL] != GPT_STATE_OK &&
table->state[GPT_ELT_SECTBL] != GPT_STATE_OK) {
- printf("GEOM: %s: corrupt or invalid GPT detected.\n",
- pp->name);
- printf("GEOM: %s: GPT rejected -- may not be recoverable.\n",
- pp->name);
+ if (table->state[GPT_ELT_PRITBL] == GPT_STATE_UNSUPPORTED &&
+ table->state[GPT_ELT_SECTBL] == GPT_STATE_UNSUPPORTED &&
+ gpt_matched_hdrs(prihdr, sechdr)) {
+ printf("GEOM: %s: unsupported GPT detected.\n",
+ pp->name);
+ printf(
+ "GEOM: %s: number of GPT entries: %u, entry size: %uB.\n",
+ pp->name, prihdr->hdr_entries, prihdr->hdr_entsz);
+ printf(
+ "GEOM: %s: maximum supported number of GPT entries: %u, entry size: %uB.\n",
+ pp->name, g_part_gpt_scheme.gps_maxent, MAXENTSIZE);
+ printf("GEOM: %s: GPT rejected.\n", pp->name);
+ } else {
+ printf("GEOM: %s: corrupt or invalid GPT detected.\n",
+ pp->name);
+ printf(
+ "GEOM: %s: GPT rejected -- may not be recoverable.\n",
+ pp->name);
+ }
if (prihdr != NULL)
g_free(prihdr);
if (pritbl != NULL)