@@ -48,6 +48,20 @@ int get_swsusp_key(u8 **skey)
return swsusp_keys->skey_status;
}
+bool swsusp_page_is_keys(struct page *page)
+{
+ bool ret = false;
+
+ if (!swsusp_keys || swsusp_keys->skey_status)
+ return ret;
+
+ ret = (page_to_pfn(page) == page_to_pfn(virt_to_page(swsusp_keys)));
+ if (ret)
+ pr_info("PM: Avoid snapshot the page of swsusp key.\n");
+
+ return ret;
+}
+
static int __init init_hibernate_keys(void)
{
struct swsusp_keys *keys;
@@ -19,6 +19,9 @@ struct swsusp_info {
#ifdef CONFIG_HIBERNATE_VERIFICATION
/* arch/x86/power/hibernate_keys.c */
extern int get_swsusp_key(u8 **skey);
+extern bool swsusp_page_is_keys(struct page *page);
+#else
+static inline bool swsusp_page_is_keys(struct page *page) { return false; }
#endif
/* kernel/power/snapshot.c */
@@ -1093,6 +1093,9 @@ static struct page *saveable_highmem_page(struct zone *zone, unsigned long pfn)
BUG_ON(!PageHighMem(page));
+ if (swsusp_page_is_keys(page))
+ return NULL;
+
if (swsusp_page_is_forbidden(page) || swsusp_page_is_free(page) ||
PageReserved(page))
return NULL;
@@ -1155,6 +1158,9 @@ static struct page *saveable_page(struct zone *zone, unsigned long pfn)
BUG_ON(PageHighMem(page));
+ if (swsusp_page_is_keys(page))
+ return NULL;
+
if (swsusp_page_is_forbidden(page) || swsusp_page_is_free(page))
return NULL;
The HMAC key should only resides in kernel memory space but not leak to outside. To avoid including swsusp key in hibernate snapshot image, this patch adds the checking block in the code for asking saveable pages to make sure the key page should not marked as saveable. Signed-off-by: Lee, Chun-Yi <jlee@suse.com> --- arch/x86/power/hibernate_keys.c | 14 ++++++++++++++ kernel/power/power.h | 3 +++ kernel/power/snapshot.c | 6 ++++++ 3 files changed, 23 insertions(+)