socsvn commit: r294624 - in soc2013/def/crashdump-head/sys: dev/null geom

def at FreeBSD.org def at FreeBSD.org
Mon Nov 30 22:04:03 UTC 2015


Author: def
Date: Mon Nov 30 22:04:02 2015
New Revision: 294624
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=294624

Log:
  Support DIOCSKERNELDUMPOLD I/O control only in FreeBSD 10. Copy encrypted key to kernel. Use new structures. Simplify code.

Modified:
  soc2013/def/crashdump-head/sys/dev/null/null.c
  soc2013/def/crashdump-head/sys/geom/geom_dev.c

Modified: soc2013/def/crashdump-head/sys/dev/null/null.c
==============================================================================
--- soc2013/def/crashdump-head/sys/dev/null/null.c	Mon Nov 30 22:01:50 2015	(r294623)
+++ soc2013/def/crashdump-head/sys/dev/null/null.c	Mon Nov 30 22:04:02 2015	(r294624)
@@ -30,6 +30,8 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include "opt_compat.h"
+
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/conf.h>
@@ -108,9 +110,11 @@
 	error = 0;
 
 	switch (cmd) {
-	case DIOCSEKCD:
+#ifdef COMPAT_FREEBSD10
+	case DIOCSKERNELDUMPOLD:
 		error = set_dumper(NULL, NULL, td, 0, NULL, 0, NULL);
 		break;
+#endif
 	case DIOCSKERNELDUMP:
 		error = set_dumper(NULL, NULL, td, 0, NULL, 0, NULL);
 		break;

Modified: soc2013/def/crashdump-head/sys/geom/geom_dev.c
==============================================================================
--- soc2013/def/crashdump-head/sys/geom/geom_dev.c	Mon Nov 30 22:01:50 2015	(r294623)
+++ soc2013/def/crashdump-head/sys/geom/geom_dev.c	Mon Nov 30 22:04:02 2015	(r294624)
@@ -36,6 +36,8 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include "opt_compat.h"
+
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/malloc.h>
@@ -145,14 +147,13 @@
 	if (error != 0)
 		return (error);
 
-	error = set_dumper(&kd.di, devtoname(dev), td, kda->kda_encrypt,
+	error = set_dumper(&kd.di, devtoname(dev), td, kda->kda_encryption,
 	    kda->kda_key, kda->kda_encryptedkeysize,
 	    kda->kda_encryptedkey);
-	if (error != 0)
-		return (error);
+	if (error == 0)
+		dev->si_flags |= SI_DUMPDEV;
 
-	dev->si_flags |= SI_DUMPDEV;
-	return (0);
+	return (error);
 }
 
 static void
@@ -468,24 +469,56 @@
 	case DIOCGFRONTSTUFF:
 		error = g_io_getattr("GEOM::frontstuff", cp, &i, data);
 		break;
-	case DIOCSEKCD: {
-		struct diocskerneldump_arg *kda;
-		kda = (struct diocskerneldump_arg *)data;
-		if (kda->kda_enable == 0)
-			error = g_dev_setdumpdev(NULL, NULL, td);
-		else
-			error = g_dev_setdumpdev(dev, kda, td);
-		break;
-	}
-	case DIOCSKERNELDUMP: {
+#ifdef COMPAT_FREEBSD10
+	case DIOCSKERNELDUMPOLD:
+	    {
 		struct diocskerneldump_arg kda;
+
+		bzero(&kda, sizeof(kda));
+		kda.kda_encryption = KERNELDUMP_ENC_NONE;
 		kda.kda_enable = (uint8_t)*(u_int *)data;
 		if (kda.kda_enable == 0)
-			error = g_dev_setdumpdev(NULL, NULL, td);
+		    error = g_dev_setdumpdev(NULL, NULL, td);
 		else
-			error = g_dev_setdumpdev(dev, &kda, td);
+		    error = g_dev_setdumpdev(dev, &kda, td);
 		break;
-	}
+	    }
+#endif
+	case DIOCSKERNELDUMP:
+	    {
+ 		struct diocskerneldump_arg *kda;
+		uint8_t *encryptedkey;
+
+ 		kda = (struct diocskerneldump_arg *)data;
+		if (kda->kda_enable == 0) {
+ 			error = g_dev_setdumpdev(NULL, NULL, td);
+			break;
+		}
+
+		if (kda->kda_encryption != KERNELDUMP_ENC_NONE) {
+			if (kda->kda_encryptedkeysize <= 0 ||
+			    kda->kda_encryptedkeysize >
+			    KERNELDUMP_ENCKEYLEN_MAX) {
+				return (EINVAL);
+			}
+			encryptedkey = malloc(kda->kda_encryptedkeysize, M_TEMP,
+			    M_WAITOK);
+			error = copyin(kda->kda_encryptedkey, encryptedkey,
+			    kda->kda_encryptedkeysize);
+		} else {
+			encryptedkey = NULL;
+		}
+		if (error == 0) {
+			kda->kda_encryptedkey = encryptedkey;
+ 			error = g_dev_setdumpdev(dev, kda, td);
+		}
+		if (encryptedkey != NULL) {
+			bzero(encryptedkey, kda->kda_encryptedkeysize);
+			free(encryptedkey, M_TEMP);
+		}
+		bzero(kda, sizeof(*kda));
+ 		break;
+	    }
 	case DIOCGFLUSH:
 		error = g_io_flush(cp);
 		break;


More information about the svn-soc-all mailing list