| From stable-bounces@linux.kernel.org Sat Feb 24 14:15:16 2007 |
| From: "Rafael J. Wysocki" <rjw@sisk.pl> |
| Date: Sat, 24 Feb 2007 23:06:43 +0100 |
| Subject: swsusp: Fix possible oops in userland interface |
| To: stable@kernel.org |
| Cc: Stefan Seyfried <seife@suse.de>, Pavel Machek <pavel@ucw.cz> |
| Message-ID: <200702242306.44445.rjw@sisk.pl> |
| Content-Disposition: inline |
| |
| From: Stefan Seyfried <seife@suse.de> |
| |
| Fix the Oops occuring when SNAPSHOT_PMOPS or SNAPSHOT_S2RAM ioctl is called on |
| a system without pm_ops defined (eg. a non-ACPI kernel on x86 PC). |
| |
| Signed-off-by: Stefan Seyfried <seife@suse.de> |
| Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> |
| Acked-by: Pavel Machek <pavel@ucw.cz> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| |
| --- |
| kernel/power/user.c | 19 ++++++++++++------- |
| 1 file changed, 12 insertions(+), 7 deletions(-) |
| |
| --- linux-2.6.20.1.orig/kernel/power/user.c |
| +++ linux-2.6.20.1/kernel/power/user.c |
| @@ -292,7 +292,7 @@ static int snapshot_ioctl(struct inode * |
| break; |
| } |
| |
| - if (pm_ops->prepare) { |
| + if (pm_ops && pm_ops->prepare) { |
| error = pm_ops->prepare(PM_SUSPEND_MEM); |
| if (error) |
| goto OutS3; |
| @@ -311,7 +311,7 @@ static int snapshot_ioctl(struct inode * |
| device_resume(); |
| } |
| resume_console(); |
| - if (pm_ops->finish) |
| + if (pm_ops && pm_ops->finish) |
| pm_ops->finish(PM_SUSPEND_MEM); |
| |
| OutS3: |
| @@ -322,20 +322,25 @@ static int snapshot_ioctl(struct inode * |
| switch (arg) { |
| |
| case PMOPS_PREPARE: |
| - if (pm_ops->prepare) { |
| + if (pm_ops && pm_ops->prepare) |
| error = pm_ops->prepare(PM_SUSPEND_DISK); |
| - } |
| + else |
| + error = -ENOSYS; |
| break; |
| |
| case PMOPS_ENTER: |
| kernel_shutdown_prepare(SYSTEM_SUSPEND_DISK); |
| - error = pm_ops->enter(PM_SUSPEND_DISK); |
| + if (pm_ops && pm_ops->enter) |
| + error = pm_ops->enter(PM_SUSPEND_DISK); |
| + else |
| + error = -ENOSYS; |
| break; |
| |
| case PMOPS_FINISH: |
| - if (pm_ops && pm_ops->finish) { |
| + if (pm_ops && pm_ops->finish) |
| pm_ops->finish(PM_SUSPEND_DISK); |
| - } |
| + else |
| + error = -ENOSYS; |
| break; |
| |
| default: |