summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_hibernate.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/subr_hibernate.c')
-rw-r--r--sys/kern/subr_hibernate.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/sys/kern/subr_hibernate.c b/sys/kern/subr_hibernate.c
index 31cff230b07..1cc4ed2f6cd 100644
--- a/sys/kern/subr_hibernate.c
+++ b/sys/kern/subr_hibernate.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: subr_hibernate.c,v 1.121 2017/03/27 20:26:39 deraadt Exp $ */
+/* $OpenBSD: subr_hibernate.c,v 1.122 2017/06/22 15:56:29 deraadt Exp $ */
/*
* Copyright (c) 2011 Ariane van der Steldt <ariane@stack.nl>
@@ -546,6 +546,17 @@ uvm_page_rle(paddr_t addr)
}
/*
+ * Calculate a hopefully unique version # for this kernel, based upon
+ * how it was linked.
+ */
+u_int32_t
+hibsum(void)
+{
+ return ((long)malloc ^ (long)km_alloc ^ (long)printf ^ (long)strlen);
+}
+
+
+/*
* Fills out the hibernate_info union pointed to by hib
* with information about this machine (swap signature block
* offsets, number of memory ranges, kernel in use, etc)
@@ -597,6 +608,7 @@ get_hibernate_info(union hibernate_info *hib, int suspend)
memset(&hib->kernel_version, 0, 128);
bcopy(version, &hib->kernel_version,
min(strlen(version), sizeof(hib->kernel_version)-1));
+ hib->kernel_sum = hibsum();
if (suspend) {
/* Grab the previously-allocated piglet addresses */
@@ -927,6 +939,12 @@ hibernate_compare_signature(union hibernate_info *mine,
return (1);
}
+ if (hibsum() != disk->kernel_sum) {
+ DPRINTF("hibernate sum version mismatch %x %x\n",
+ hibsum(), disk->kernel_sum);
+ return (1);
+ }
+
for (i = 0; i < mine->nranges; i++) {
if ((mine->ranges[i].base != disk->ranges[i].base) ||
(mine->ranges[i].end != disk->ranges[i].end) ) {