| From 16fd432b5501e64c9ffa019ea7617bbc9c36775c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 28 May 2021 16:26:14 +0800 |
| Subject: visorbus: fix error return code in visorchipset_init() |
| |
| From: Zhen Lei <thunder.leizhen@huawei.com> |
| |
| [ Upstream commit ce52ec5beecc1079c251f60e3973b3758f60eb59 ] |
| |
| Commit 1366a3db3dcf ("staging: unisys: visorbus: visorchipset_init clean |
| up gotos") assigns the initial value -ENODEV to the local variable 'err', |
| and the first several error branches will return this value after "goto |
| error". But commit f1f537c2e7f5 ("staging: unisys: visorbus: Consolidate |
| controlvm channel creation.") overwrites 'err' in the middle of the way. |
| As a result, some error branches do not successfully return the initial |
| value -ENODEV of 'err', but return 0. |
| |
| In addition, when kzalloc() fails, -ENOMEM should be returned instead of |
| -ENODEV. |
| |
| Fixes: f1f537c2e7f5 ("staging: unisys: visorbus: Consolidate controlvm channel creation.") |
| Reported-by: Hulk Robot <hulkci@huawei.com> |
| Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com> |
| Link: https://lore.kernel.org/r/20210528082614.9337-1-thunder.leizhen@huawei.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/visorbus/visorchipset.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/visorbus/visorchipset.c b/drivers/visorbus/visorchipset.c |
| index cb1eb7e05f87..5668cad86e37 100644 |
| --- a/drivers/visorbus/visorchipset.c |
| +++ b/drivers/visorbus/visorchipset.c |
| @@ -1561,7 +1561,7 @@ schedule_out: |
| |
| static int visorchipset_init(struct acpi_device *acpi_device) |
| { |
| - int err = -ENODEV; |
| + int err = -ENOMEM; |
| struct visorchannel *controlvm_channel; |
| |
| chipset_dev = kzalloc(sizeof(*chipset_dev), GFP_KERNEL); |
| @@ -1584,8 +1584,10 @@ static int visorchipset_init(struct acpi_device *acpi_device) |
| "controlvm", |
| sizeof(struct visor_controlvm_channel), |
| VISOR_CONTROLVM_CHANNEL_VERSIONID, |
| - VISOR_CHANNEL_SIGNATURE)) |
| + VISOR_CHANNEL_SIGNATURE)) { |
| + err = -ENODEV; |
| goto error_delete_groups; |
| + } |
| /* if booting in a crash kernel */ |
| if (is_kdump_kernel()) |
| INIT_DELAYED_WORK(&chipset_dev->periodic_controlvm_work, |
| -- |
| 2.30.2 |
| |