svn commit: r311964 - head/sys/geom/raid

Conrad E. Meyer cem at FreeBSD.org
Thu Jan 12 06:58:33 UTC 2017


Author: cem
Date: Thu Jan 12 06:58:31 2017
New Revision: 311964
URL: https://svnweb.freebsd.org/changeset/base/311964

Log:
  g_raid: Prevent tasters from attempting excessively large reads
  
  Some g_raid tasters attempt metadata reads in multiples of the provider
  sectorsize.  Reads larger than MAXPHYS are invalid, so detect and abort
  in such situations.
  
  Spiritually similar to r217305 / PR 147851.
  
  PR:		214721
  Sponsored by:	Dell EMC Isilon

Modified:
  head/sys/geom/raid/md_ddf.c
  head/sys/geom/raid/md_promise.c

Modified: head/sys/geom/raid/md_ddf.c
==============================================================================
--- head/sys/geom/raid/md_ddf.c	Thu Jan 12 06:38:03 2017	(r311963)
+++ head/sys/geom/raid/md_ddf.c	Thu Jan 12 06:58:31 2017	(r311964)
@@ -1161,6 +1161,16 @@ hdrerror:
 		    (GET16(meta, hdr->Configuration_Record_Length) * ss - 512) / 12));
 	}
 
+	if (GET32(meta, hdr->cd_length) * ss >= MAXPHYS ||
+	    GET32(meta, hdr->pdr_length) * ss >= MAXPHYS ||
+	    GET32(meta, hdr->vdr_length) * ss >= MAXPHYS ||
+	    GET32(meta, hdr->cr_length) * ss >= MAXPHYS ||
+	    GET32(meta, hdr->pdd_length) * ss >= MAXPHYS ||
+	    GET32(meta, hdr->bbmlog_length) * ss >= MAXPHYS) {
+		G_RAID_DEBUG(1, "%s: Blocksize is too big.", pp->name);
+		goto hdrerror;
+	}
+
 	/* Read controller data. */
 	buf = g_read_data(cp, (lba + GET32(meta, hdr->cd_section)) * ss,
 	    GET32(meta, hdr->cd_length) * ss, &error);

Modified: head/sys/geom/raid/md_promise.c
==============================================================================
--- head/sys/geom/raid/md_promise.c	Thu Jan 12 06:38:03 2017	(r311963)
+++ head/sys/geom/raid/md_promise.c	Thu Jan 12 06:58:31 2017	(r311964)
@@ -341,6 +341,11 @@ promise_meta_read(struct g_consumer *cp,
 
 	pp = cp->provider;
 	subdisks = 0;
+
+	if (pp->sectorsize * 4 > MAXPHYS) {
+		G_RAID_DEBUG(1, "%s: Blocksize is too big.", pp->name);
+		return (subdisks);
+	}
 next:
 	/* Read metadata block. */
 	buf = g_read_data(cp, pp->mediasize - pp->sectorsize *


More information about the svn-src-all mailing list