socsvn commit: r257634 - in soc2013/def/crashdump-head: etc/rc.d sbin/savecore
def at FreeBSD.org
def at FreeBSD.org
Mon Sep 23 04:20:38 UTC 2013
Author: def
Date: Mon Sep 23 04:20:37 2013
New Revision: 257634
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=257634
Log:
Don't decrypt a crash dump in savecore any more.
Added:
soc2013/def/crashdump-head/sbin/savecore/dumpfile.c
soc2013/def/crashdump-head/sbin/savecore/dumpfile.h
Deleted:
soc2013/def/crashdump-head/sbin/savecore/decryptfile.c
soc2013/def/crashdump-head/sbin/savecore/decryptfile.h
Modified:
soc2013/def/crashdump-head/etc/rc.d/savecore
soc2013/def/crashdump-head/sbin/savecore/Makefile
soc2013/def/crashdump-head/sbin/savecore/savecore.c
Modified: soc2013/def/crashdump-head/etc/rc.d/savecore
==============================================================================
--- soc2013/def/crashdump-head/etc/rc.d/savecore Mon Sep 23 03:13:32 2013 (r257633)
+++ soc2013/def/crashdump-head/etc/rc.d/savecore Mon Sep 23 04:20:37 2013 (r257634)
@@ -13,7 +13,6 @@
start_cmd="savecore_start"
start_precmd="savecore_prestart"
stop_cmd=":"
-savecore_flags="${savecore_flags} -p ${dumpkey_priv}"
savecore_prestart()
{
Modified: soc2013/def/crashdump-head/sbin/savecore/Makefile
==============================================================================
--- soc2013/def/crashdump-head/sbin/savecore/Makefile Mon Sep 23 03:13:32 2013 (r257633)
+++ soc2013/def/crashdump-head/sbin/savecore/Makefile Mon Sep 23 04:20:37 2013 (r257634)
@@ -1,17 +1,11 @@
# $FreeBSD$
SYS= ${.CURDIR}/../../sys
-.PATH: ${SYS}/crypto/camellia ${SYS}/crypto/rijndael
-.PATH: ${SYS}/crypto/hmac ${SYS}/crypto/sha2 ${SYS}/crypto
PROG= savecore
-SRCS= ${PROG}.c decryptfile.c
-SRCS+= rijndael-api.c rijndael-api-fst.c rijndael-alg-fst.c
-SRCS+= camellia.c
-SRCS+= hmac.c sha2.c
-SRCS+= xts.c
-DPADD= ${LIBZ} ${LIBCRYPTO}
-LDADD= -lz -lcrypto
+SRCS= ${PROG}.c dumpfile.c
+DPADD= ${LIBZ}
+LDADD= -lz
CFLAGS+=-I${SYS}
WARNS?= 2
MAN= savecore.8
Added: soc2013/def/crashdump-head/sbin/savecore/dumpfile.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ soc2013/def/crashdump-head/sbin/savecore/dumpfile.c Mon Sep 23 04:20:37 2013 (r257634)
@@ -0,0 +1,111 @@
+#include <sys/param.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "dumpfile.h"
+
+int
+save_key_for(dumpFile *fd, const char *keyname)
+{
+ FILE *fp;
+
+ fp = fopen(keyname, "w");
+
+ if (fp == NULL)
+ return (-1);
+
+ if (fwrite(fd->encrypted_key, 1, KERNELDUMP_ENCRYPTED_KEY_SIZE, fp)
+ != KERNELDUMP_ENCRYPTED_KEY_SIZE) {
+ fclose(fp);
+
+ return (-1);
+ }
+
+ fclose(fp);
+
+ return (0);
+}
+
+FILE *
+dopen(const char *fname, const char *mode, const char *keyname,
+ const struct kerneldumpheader *h)
+{
+ dumpFile *fd;
+ FILE *fp;
+
+ /* Currently other modes are not implemented. */
+ if (*mode != 'w')
+ return (NULL);
+
+ fp = fopen(fname, mode);
+
+ if (fp == NULL)
+ return (NULL);
+
+ fd = (dumpFile *)malloc(sizeof(dumpFile));
+ fd->fp = fp;
+
+ fd->keysize = h->keysize;
+ memcpy(fd->encrypted_key, h->encrypted_key, KERNELDUMP_ENCRYPTED_KEY_SIZE);
+
+ save_key_for(fd, keyname);
+
+ fd->buf_used = 0;
+
+ return (funopen(fd, NULL, dwrite, NULL, dclose));
+}
+
+int
+dwrite(void *cookie, const char *data, int size)
+{
+ dumpFile *fd = (dumpFile *)cookie;
+ int resid, saved;
+
+ saved = 0;
+
+ while (size + fd->buf_used >= PEFS_SECTOR_SIZE) {
+ resid = PEFS_SECTOR_SIZE - fd->buf_used;
+ memcpy(fd->buf + fd->buf_used, data, resid);
+ fd->buf_used += resid;
+
+ if (fwrite(fd->buf, 1, PEFS_SECTOR_SIZE, fd->fp) != PEFS_SECTOR_SIZE)
+ return (0);
+
+ data += resid;
+ size -= resid;
+ fd->buf_used = 0;
+ saved += resid;
+ }
+
+ if (size > 0) {
+ memcpy(fd->buf + fd->buf_used, data, size);
+ fd->buf_used += size;
+ saved += size;
+ }
+
+ return (saved);
+}
+
+int
+dclose(void *cookie)
+{
+ dumpFile *fd = (dumpFile *)cookie;
+ int error;
+
+ if (fd->buf_used > 0) {
+ if (fwrite(fd->buf, 1, fd->buf_used, fd->fp) != 1)
+ return (0);
+
+ fd->buf_used = 0;
+ }
+
+ error = fclose(fd->fp);
+
+ if (error < 0)
+ return (error);
+
+ free(fd);
+
+ return (error);
+}
+
Added: soc2013/def/crashdump-head/sbin/savecore/dumpfile.h
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ soc2013/def/crashdump-head/sbin/savecore/dumpfile.h Mon Sep 23 04:20:37 2013 (r257634)
@@ -0,0 +1,22 @@
+#ifndef _DUMPFILE_H
+#define _DUMPFILE_H
+
+#include <sys/kerneldump.h>
+
+typedef struct _dumpFile {
+ FILE *fp;
+ int keysize;
+ char encrypted_key[KERNELDUMP_ENCRYPTED_KEY_SIZE];
+#define PEFS_SECTOR_SIZE 4096
+ char buf[PEFS_SECTOR_SIZE];
+ int buf_used;
+} dumpFile;
+
+FILE *dopen(const char *fname, const char *mode, const char *keyname,
+ const struct kerneldumpheader *h);
+int dwrite(void *cookie, const char *data, int size);
+int dclose(void *cookie);
+int save_key_for(dumpFile *fd, const char *keyname);
+
+#endif /* _DUMPFILE_H */
+
Modified: soc2013/def/crashdump-head/sbin/savecore/savecore.c
==============================================================================
--- soc2013/def/crashdump-head/sbin/savecore/savecore.c Mon Sep 23 03:13:32 2013 (r257633)
+++ soc2013/def/crashdump-head/sbin/savecore/savecore.c Mon Sep 23 04:20:37 2013 (r257634)
@@ -80,7 +80,7 @@
#include <syslog.h>
#include <time.h>
#include <unistd.h>
-#include "decryptfile.h"
+#include "dumpfile.h"
/* The size of the buffer used for I/O. */
#define BUFFERSIZE (1024*1024)
@@ -89,10 +89,9 @@
#define STATUS_GOOD 1
#define STATUS_UNKNOWN 2
-static int checkfor, compress, clear, decrypt, force, keep, verbose; /* flags */
+static int checkfor, compress, clear, force, isencrypted, keep, verbose; /* flags */
static int nfound, nsaved, nerr; /* statistics */
static int maxdumps;
-static char *private_key_file;
extern FILE *zopen(const char *, const char *);
@@ -123,7 +122,6 @@
fprintf(f, " Panic String: %s\n", h->panicstring);
fprintf(f, " Dump Parity: %u\n", h->parity);
fprintf(f, " Bounds: %d\n", bounds);
- fprintf(f, " Key length: %d bits\n", h->keysize << 3);
switch(status) {
case STATUS_BAD:
@@ -316,7 +314,7 @@
}
if (compress) {
nw = fwrite(buf, 1, wl, fp);
- } else if (decrypt) {
+ } else if (isencrypted) {
nw = fwrite(buf, 1, wl, fp);
} else {
for (nw = 0; nw < nr; nw = he) {
@@ -633,11 +631,11 @@
snprintf(corename, sizeof(corename), "%s.%d.gz",
istextdump ? "textdump.tar" : "vmcore", bounds);
fp = zopen(corename, "w");
- } else if (decrypt) {
+ } else if (isencrypted) {
snprintf(corename, sizeof(corename), "%s.%d",
istextdump ? "textdump.tar" : "vmcore", bounds);
snprintf(keyname, sizeof(keyname), "key.%d", bounds);
- fp = dopen(corename, "w", keyname, private_key_file, &kdhl);
+ fp = dopen(corename, "w", keyname, &kdhl);
} else {
snprintf(corename, sizeof(corename), "%s.%d",
istextdump ? "textdump.tar" : "vmcore", bounds);
@@ -666,7 +664,7 @@
fclose(info);
syslog(LOG_NOTICE, "writing %score to %s/%s",
- compress ? "compressed " : (decrypt ? "decrypted " : ""), savedir, corename);
+ compress ? "compressed " : (isencrypted ? "encrypted " : ""), savedir, corename);
if (istextdump) {
if (DoTextdumpFile(fd, dumpsize, lasthd, buf, device,
@@ -694,9 +692,6 @@
if (compress) {
snprintf(linkname, sizeof(linkname), "%s.last.gz",
istextdump ? "textdump.tar" : "vmcore");
- } else if (decrypt) {
- snprintf(linkname, sizeof(linkname), "%s.last",
- istextdump ? "textdump.tar" : "vmcore");
} else {
snprintf(linkname, sizeof(linkname), "%s.last",
istextdump ? "textdump.tar" : "vmcore");
@@ -738,7 +733,7 @@
fprintf(stderr, "%s\n%s\n%s\n",
"usage: savecore -c [-v] [device ...]",
" savecore -C [-v] [device ...]",
- " savecore [-dfkvz] [-m maxdumps] [-p private_key] [directory [device ...]]");
+ " savecore [-efkvz] [-m maxdumps] [directory [device ...]]");
exit(1);
}
@@ -749,14 +744,13 @@
struct fstab *fsp;
int i, ch, error;
- checkfor = compress = clear = decrypt = force = keep = verbose = 0;
+ checkfor = compress = clear = force = isencrypted = keep = verbose = 0;
nfound = nsaved = nerr = 0;
- private_key_file = NULL;
openlog("savecore", LOG_PERROR, LOG_DAEMON);
signal(SIGINFO, infohandler);
- while ((ch = getopt(argc, argv, "Ccdfkm:p:vz")) != -1)
+ while ((ch = getopt(argc, argv, "Ccefkm:vz")) != -1)
switch(ch) {
case 'C':
checkfor = 1;
@@ -764,8 +758,8 @@
case 'c':
clear = 1;
break;
- case 'd':
- decrypt = 1;
+ case 'e':
+ isencrypted = 1;
break;
case 'f':
force = 1;
@@ -780,9 +774,6 @@
exit(1);
}
break;
- case 'p':
- private_key_file = optarg;
- break;
case 'v':
verbose++;
break;
@@ -799,8 +790,6 @@
usage();
if (maxdumps > 0 && (checkfor || clear))
usage();
- if (decrypt && private_key_file == NULL)
- usage();
argc -= optind;
argv += optind;
if (argc >= 1 && !checkfor && !clear) {
More information about the svn-soc-all
mailing list