Module Name:    src
Committed By:   mlelstv
Date:           Wed Sep 14 23:16:30 UTC 2016

Modified Files:
        src/sys/dev: cgd.c

Log Message:
Fix error handling in cgdstrategy().

- check cgd_softc != NULL, may happen in rare memory shortage situations.
- no longer test geometry, the same check is done in dk_strategy which
  knows to check for an uninitialized geometry.


To generate a diff of this commit:
cvs rdiff -u -r1.110 -r1.111 src/sys/dev/cgd.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/cgd.c
diff -u src/sys/dev/cgd.c:1.110 src/sys/dev/cgd.c:1.111
--- src/sys/dev/cgd.c:1.110	Fri Aug  5 08:24:46 2016
+++ src/sys/dev/cgd.c	Wed Sep 14 23:16:30 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: cgd.c,v 1.110 2016/08/05 08:24:46 pgoyette Exp $ */
+/* $NetBSD: cgd.c,v 1.111 2016/09/14 23:16:30 mlelstv Exp $ */
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cgd.c,v 1.110 2016/08/05 08:24:46 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cgd.c,v 1.111 2016/09/14 23:16:30 mlelstv Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -305,30 +305,32 @@ cgdclose(dev_t dev, int flags, int fmt, 
 static void
 cgdstrategy(struct buf *bp)
 {
-	struct	cgd_softc *cs = getcgd_softc(bp->b_dev);
-	struct	dk_softc *dksc = &cs->sc_dksc;
-	struct	disk_geom *dg = &dksc->sc_dkdev.dk_geom;
+	struct	cgd_softc *cs;
 
 	DPRINTF_FOLLOW(("cgdstrategy(%p): b_bcount = %ld\n", bp,
 	    (long)bp->b_bcount));
 
+	cs = getcgd_softc(bp->b_dev);
+	if (!cs) {
+		bp->b_error = ENXIO;
+		goto bail;
+	}
+
 	/*
-	 * Reject unaligned writes.  We can encrypt and decrypt only
-	 * complete disk sectors, and we let the ciphers require their
-	 * buffers to be aligned to 32-bit boundaries.
+	 * Reject unaligned writes.
 	 */
-	if (bp->b_blkno < 0 ||
-	    (bp->b_bcount % dg->dg_secsize) != 0 ||
-	    ((uintptr_t)bp->b_data & 3) != 0) {
+	if (((uintptr_t)bp->b_data & 3) != 0) {
 		bp->b_error = EINVAL;
-		bp->b_resid = bp->b_bcount;
-		biodone(bp);
-		return;
+		goto bail;
 	}
 
-	/* XXXrcd: Should we test for (cs != NULL)? */
 	dk_strategy(&cs->sc_dksc, bp);
 	return;
+
+bail:
+	bp->b_resid = bp->b_bcount;
+	biodone(bp);
+	return;
 }
 
 static int

Reply via email to