diff options
author | Jiri Slaby <jslaby@suse.cz> | 2011-01-06 19:42:31 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2011-01-07 00:26:45 -0500 |
commit | 26fcaf60fe3861409eb4c455c5c0d0f00f599b08 (patch) | |
tree | 43b0b91df3a1c8d136b63ce499001a05c9a02c93 /kernel/power/nvs.c | |
parent | 3c0eee3fe6a3a1c745379547c7e7c904aa64f6d5 (diff) |
PM: Fix oops in suspend/hibernate code related to failing ioremap()
When ioremap() fails (which might happen for some reason), we nicely
oops in suspend_nvs_save() due to NULL dereference by memcpy() in there.
Fail gracefully instead.
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'kernel/power/nvs.c')
-rw-r--r-- | kernel/power/nvs.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/kernel/power/nvs.c b/kernel/power/nvs.c index 1836db60bbb6..57c6fabbb6b6 100644 --- a/kernel/power/nvs.c +++ b/kernel/power/nvs.c | |||
@@ -105,7 +105,7 @@ int suspend_nvs_alloc(void) | |||
105 | /** | 105 | /** |
106 | * suspend_nvs_save - save NVS memory regions | 106 | * suspend_nvs_save - save NVS memory regions |
107 | */ | 107 | */ |
108 | void suspend_nvs_save(void) | 108 | int suspend_nvs_save(void) |
109 | { | 109 | { |
110 | struct nvs_page *entry; | 110 | struct nvs_page *entry; |
111 | 111 | ||
@@ -114,8 +114,14 @@ void suspend_nvs_save(void) | |||
114 | list_for_each_entry(entry, &nvs_list, node) | 114 | list_for_each_entry(entry, &nvs_list, node) |
115 | if (entry->data) { | 115 | if (entry->data) { |
116 | entry->kaddr = ioremap(entry->phys_start, entry->size); | 116 | entry->kaddr = ioremap(entry->phys_start, entry->size); |
117 | if (!entry->kaddr) { | ||
118 | suspend_nvs_free(); | ||
119 | return -ENOMEM; | ||
120 | } | ||
117 | memcpy(entry->data, entry->kaddr, entry->size); | 121 | memcpy(entry->data, entry->kaddr, entry->size); |
118 | } | 122 | } |
123 | |||
124 | return 0; | ||
119 | } | 125 | } |
120 | 126 | ||
121 | /** | 127 | /** |