Module Name:    src
Committed By:   christos
Date:           Tue Nov 10 20:05:51 UTC 2009

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

Log Message:
avoid variable array stack allocation by enforcing and allocating always the
maximum.


To generate a diff of this commit:
cvs rdiff -u -r1.61 -r1.62 src/sys/dev/cgd.c
cvs rdiff -u -r1.12 -r1.13 src/sys/dev/cgdvar.h

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.61 src/sys/dev/cgd.c:1.62
--- src/sys/dev/cgd.c:1.61	Tue Nov 10 11:49:53 2009
+++ src/sys/dev/cgd.c	Tue Nov 10 15:05:50 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: cgd.c,v 1.61 2009/11/10 16:49:53 tron Exp $ */
+/* $NetBSD: cgd.c,v 1.62 2009/11/10 20:05:50 christos Exp $ */
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cgd.c,v 1.61 2009/11/10 16:49:53 tron Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cgd.c,v 1.62 2009/11/10 20:05:50 christos Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -48,6 +48,7 @@
 #include <sys/fcntl.h>
 #include <sys/vnode.h>
 #include <sys/conf.h>
+#include <sys/syslog.h>
 
 #include <dev/dkvar.h>
 #include <dev/cgdvar.h>
@@ -183,15 +184,16 @@
 		return;
 	}
 
-	cgd_softc = (void *)malloc(num * sizeof(*cgd_softc), M_DEVBUF, M_NOWAIT);
+	cgd_softc = malloc(num * sizeof(*cgd_softc), M_DEVBUF, M_NOWAIT);
 	if (!cgd_softc) {
-		printf("WARNING: unable to malloc(9) memory for crypt disks\n");
+		DPRINTF_FOLLOW(("WARNING: unable to malloc(9) memory for %d "
+		    "crypt disks\n", num));
 		DIAGPANIC(("cgdattach: cannot malloc(9) enough memory"));
 		return;
 	}
 
 	numcgd = num;
-	for (i=0; i<num; i++)
+	for (i = 0; i < num; i++)
 		cgdsoftc_init(&cgd_softc[i], i);
 }
 
@@ -362,7 +364,8 @@
 	    nbp->b_bcount));
 	if (nbp->b_error != 0) {
 		obp->b_error = nbp->b_error;
-		printf("%s: error %d\n", dksc->sc_xname, obp->b_error);
+		DPRINTF(CGDB_IO, ("%s: error %d\n", dksc->sc_xname,
+		    obp->b_error));
 	}
 
 	/* Perform the decryption if we are reading.
@@ -572,6 +575,12 @@
 	cs->sc_cdata.cf_mode = encblkno[i].v;
 	cs->sc_cdata.cf_priv = cs->sc_cfuncs->cf_init(ci->ci_keylen, inbuf,
 	    &cs->sc_cdata.cf_blocksize);
+	if (cs->sc_cdata.cf_blocksize > CGD_MAXBLOCKSIZE) {
+	    log(LOG_WARNING, "cgd: Disallowed cipher with blocksize %zu > %u\n",
+		cs->sc_data.cf_blocksize, CGD_MAXBLOCKSIZE);
+	    cs->sc_cdata.cf_priv = NULL;
+	}
+		
 	/*
 	 * The blocksize is supposed to be in bytes. Unfortunately originally
 	 * it was expressed in bits. For compatibility we maintain encblkno
@@ -580,7 +589,6 @@
 	cs->sc_cdata.cf_blocksize /= encblkno[i].d;
 	(void)memset(inbuf, 0, MAX_KEYSIZE);
 	if (!cs->sc_cdata.cf_priv) {
-		printf("cgd: unable to initialize cipher\n");
 		ret = EINVAL;		/* XXX is this the right error? */
 		goto bail;
 	}
@@ -775,9 +783,9 @@
 	struct iovec	dstiov[2];
 	struct iovec	srciov[2];
 	size_t		blocksize = cs->sc_cdata.cf_blocksize;
-	char		sink[blocksize];
-	char		zero_iv[blocksize];
-	char		blkno_buf[blocksize];
+	char		sink[CGD_MAXBLOCKSIZE];
+	char		zero_iv[CGD_MAXBLOCKSIZE];
+	char		blkno_buf[CGD_MAXBLOCKSIZE];
 
 	DPRINTF_FOLLOW(("cgd_cipher() dir=%d\n", dir));
 

Index: src/sys/dev/cgdvar.h
diff -u src/sys/dev/cgdvar.h:1.12 src/sys/dev/cgdvar.h:1.13
--- src/sys/dev/cgdvar.h:1.12	Fri Sep 12 12:51:55 2008
+++ src/sys/dev/cgdvar.h	Tue Nov 10 15:05:50 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: cgdvar.h,v 1.12 2008/09/12 16:51:55 christos Exp $ */
+/* $NetBSD: cgdvar.h,v 1.13 2009/11/10 20:05:50 christos Exp $ */
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -87,4 +87,7 @@
 #define CGDIOCSET	_IOWR('F', 18, struct cgd_ioctl)
 #define CGDIOCCLR	_IOW('F', 19, struct cgd_ioctl)
 
+/* Maximum block sized to be used by the ciphers */
+#define CGD_MAXBLOCKSIZE	128
+
 #endif /* _DEV_CGDVAR_H_ */

Reply via email to