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 | |
| 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')
| -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 | /** |
