Module Name:    src
Committed By:   riastradh
Date:           Thu May 19 20:34:13 UTC 2011

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

Log Message:
Reject unaligned writes to cgd.

Fixes the following PRs:

PR kern/44515 (cgd dies on non-aligned writes to the raw device)
PR kern/44964 (cgd seems to panic on unaligned writes instead of giving EINVAL)

ok christos


To generate a diff of this commit:
cvs rdiff -u -r1.71 -r1.72 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.71 src/sys/dev/cgd.c:1.72
--- src/sys/dev/cgd.c:1.71	Fri Nov 19 06:44:39 2010
+++ src/sys/dev/cgd.c	Thu May 19 20:34:13 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: cgd.c,v 1.71 2010/11/19 06:44:39 dholland Exp $ */
+/* $NetBSD: cgd.c,v 1.72 2011/05/19 20:34:13 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cgd.c,v 1.71 2010/11/19 06:44:39 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cgd.c,v 1.72 2011/05/19 20:34:13 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -293,6 +293,21 @@
 
 	DPRINTF_FOLLOW(("cgdstrategy(%p): b_bcount = %ld\n", bp,
 	    (long)bp->b_bcount));
+
+	/*
+	 * 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.
+	 */
+	if (bp->b_blkno < 0 ||
+	    (bp->b_bcount % DEV_BSIZE) != 0 ||
+	    ((uintptr_t)bp->b_data & 3) != 0) {
+		bp->b_error = EINVAL;
+		bp->b_resid = bp->b_bcount;
+		biodone(bp);
+		return;
+	}
+
 	/* XXXrcd: Should we test for (cs != NULL)? */
 	dk_strategy(di, &cs->sc_dksc, bp);
 	return;

Reply via email to