⬢ DragonFlyBSD Kernel Audit
DF-4781 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/misc/dcons/dcons_os.c
+++ b/sys/dev/misc/dcons/dcons_os.c
@@ -461,6 +461,11 @@
 		 */ 
 		dg.buf = (struct dcons_buf *) contigmalloc(dg.size,
 			M_DEVBUF, 0, 0x10000, 0xffffffff, PAGE_SIZE, 0ul);
+		if (dg.buf == NULL) {
+			kprintf("dcons: contigmalloc(%zu) failed\n", dg.size);
+			drv_init = -1;
+			return (-1);
+		}
 		dcons_init(dg.buf, dg.size, sc);
 	}
 
@@ -556,7 +561,8 @@
 	switch (type) {
 	case MOD_LOAD:
 		ret = dcons_drv_init(1);
-		dcons_attach();
+		if (ret == 0)
+			dcons_attach();
 #if 0 /* XXX __FreeBSD_version >= 500000 */
 		if (ret == 0) {
 			dcons_cnprobe(&dcons_consdev);
@@ -581,9 +587,10 @@
 #endif
 		dcons_detach(DCONS_CON);
 		dcons_detach(DCONS_GDB);
-		dg.buf->magic = 0;
-
-		contigfree(dg.buf, DCONS_BUF_SIZE, M_DEVBUF);
+		if (dg.buf != NULL) {
+			dg.buf->magic = 0;
+			contigfree(dg.buf, DCONS_BUF_SIZE, M_DEVBUF);
+		}
 
 		break;
 	case MOD_SHUTDOWN: