⬢ DragonFlyBSD Kernel Audit
DF-2911 / fix.diff
← back to finding ↓ download raw
--- a/sys/kern/subr_disklabel64.c
+++ b/sys/kern/subr_disklabel64.c
@@ -285,6 +285,12 @@
 		return (EINVAL);
 	if (nlp->d_pstop & (ssp->dss_secsize - 1))
 		return (EINVAL);
+	if (nlp->d_bbase > nlp->d_total_size)
+		return (EINVAL);
+	if (nlp->d_pbase < nlp->d_bbase ||
+	    nlp->d_pbase > nlp->d_pstop ||
+	    nlp->d_pstop > nlp->d_total_size)
+		return (EINVAL);
 	if (nlp->d_abase & (ssp->dss_secsize - 1))
 		return (EINVAL);
 
@@ -299,7 +305,8 @@
 			return (EINVAL);
 		if (npp->p_bsize & (ssp->dss_secsize - 1))
 			return (EINVAL);
-		if (npp->p_boffset < nlp->d_pbase)
+		if (npp->p_boffset < nlp->d_pbase ||
+		    npp->p_boffset < nlp->d_bbase)
 			return (ENOSPC);
 		if (npp->p_boffset + npp->p_bsize > nlp->d_total_size)
 			return (ENOSPC);