diff mbox series

Staging: iommu: Replace null pointer check with IS_ERR in arm_smmu_domain_alloc_user()

Message ID 20240922155621.49432-1-kdipendra88@gmail.com (mailing list archive)
State New, archived
Headers show
Series Staging: iommu: Replace null pointer check with IS_ERR in arm_smmu_domain_alloc_user() | expand

Commit Message

Dipendra Khadka Sept. 22, 2024, 3:56 p.m. UTC
The smatch reported following:
'''
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c:3065 arm_smmu_domain_alloc_user() warn: 'smmu_domain' is an error pointer or valid
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c:3068 arm_smmu_domain_alloc_user() error: 'smmu_domain' dereferencing possible ERR_PTR()
'''

The function arm_smmu_domain_alloc() handles the null pointer after
kzalloc and returns ERR_PTR(-ENOMEM).

Replacing condition check !smmu_domain with IS_ERR(smmu_domain) and
returning smmu_domain.

Signed-off-by: Dipendra Khadka <kdipendra88@gmail.com>
---
 drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Pranjal Shrivastava Sept. 23, 2024, 3:10 a.m. UTC | #1
On Sun, Sep 22, 2024 at 03:56:20PM +0000, Dipendra Khadka wrote:
> The smatch reported following:
> '''
> drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c:3065 arm_smmu_domain_alloc_user() warn: 'smmu_domain' is an error pointer or valid
> drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c:3068 arm_smmu_domain_alloc_user() error: 'smmu_domain' dereferencing possible ERR_PTR()
> '''
> 
> The function arm_smmu_domain_alloc() handles the null pointer after
> kzalloc and returns ERR_PTR(-ENOMEM).
> 
> Replacing condition check !smmu_domain with IS_ERR(smmu_domain) and
> returning smmu_domain.

Hi Dipendra,

Thanks for looking into the code. However, I think this was fixed last
month by Dan's patch [1] and has been merged in the master branch.
Please pull the latest. :)

[1]
 https://lore.kernel.org/linux-arm-kernel/172381875518.1794999.1134549433569030700.b4-ty@kernel.org/T/

> 
> Signed-off-by: Dipendra Khadka <kdipendra88@gmail.com>
> ---
>  drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> index a31460f9f3d4..19c53c6f7578 100644
> --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> @@ -3062,8 +3062,8 @@ arm_smmu_domain_alloc_user(struct device *dev, u32 flags,
>  		return ERR_PTR(-EOPNOTSUPP);
>  
>  	smmu_domain = arm_smmu_domain_alloc();
> -	if (!smmu_domain)
> -		return ERR_PTR(-ENOMEM);
> +	if (IS_ERR(smmu_domain))
> +		return smmu_domain;

Quick note, using something like `ERR_CAST` is better in such cases.

>  
>  	smmu_domain->domain.type = IOMMU_DOMAIN_UNMANAGED;
>  	smmu_domain->domain.ops = arm_smmu_ops.default_domain_ops;
> -- 
> 2.43.0
> 
> 

Thanks,
Pranjal
Dipendra Khadka Sept. 23, 2024, 4:07 a.m. UTC | #2
Hi Pranjal,

On Mon, 23 Sept 2024 at 08:55, Pranjal Shrivastava <praan@google.com> wrote:
>
> On Sun, Sep 22, 2024 at 03:56:20PM +0000, Dipendra Khadka wrote:
> > The smatch reported following:
> > '''
> > drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c:3065 arm_smmu_domain_alloc_user() warn: 'smmu_domain' is an error pointer or valid
> > drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c:3068 arm_smmu_domain_alloc_user() error: 'smmu_domain' dereferencing possible ERR_PTR()
> > '''
> >
> > The function arm_smmu_domain_alloc() handles the null pointer after
> > kzalloc and returns ERR_PTR(-ENOMEM).
> >
> > Replacing condition check !smmu_domain with IS_ERR(smmu_domain) and
> > returning smmu_domain.
>
> Hi Dipendra,
>
> Thanks for looking into the code. However, I think this was fixed last
> month by Dan's patch [1] and has been merged in the master branch.
> Please pull the latest. :)
>
> [1]
>  https://lore.kernel.org/linux-arm-kernel/172381875518.1794999.1134549433569030700.b4-ty@kernel.org/T/
>

I just checked on the staging-next. I will make sure to check on this
tree as well.

> >
> > Signed-off-by: Dipendra Khadka <kdipendra88@gmail.com>
> > ---
> >  drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> > index a31460f9f3d4..19c53c6f7578 100644
> > --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> > +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
> > @@ -3062,8 +3062,8 @@ arm_smmu_domain_alloc_user(struct device *dev, u32 flags,
> >               return ERR_PTR(-EOPNOTSUPP);
> >
> >       smmu_domain = arm_smmu_domain_alloc();
> > -     if (!smmu_domain)
> > -             return ERR_PTR(-ENOMEM);
> > +     if (IS_ERR(smmu_domain))
> > +             return smmu_domain;
>
> Quick note, using something like `ERR_CAST` is better in such cases.
>

Thanks a lot for the knowledge.

> >
> >       smmu_domain->domain.type = IOMMU_DOMAIN_UNMANAGED;
> >       smmu_domain->domain.ops = arm_smmu_ops.default_domain_ops;
> > --
> > 2.43.0
> >
> >
>
> Thanks,
> Pranjal

Thanks,
Dipendra Khadka
kernel test robot Sept. 24, 2024, 11:29 p.m. UTC | #3
Hi Dipendra,

kernel test robot noticed the following build errors:

[auto build test ERROR on staging/staging-testing]

url:    https://github.com/intel-lab-lkp/linux/commits/Dipendra-Khadka/Staging-iommu-Replace-null-pointer-check-with-IS_ERR-in-arm_smmu_domain_alloc_user/20240922-235756
base:   staging/staging-testing
patch link:    https://lore.kernel.org/r/20240922155621.49432-1-kdipendra88%40gmail.com
patch subject: [PATCH] Staging: iommu:  Replace null pointer check with IS_ERR in arm_smmu_domain_alloc_user()
config: arm64-randconfig-001-20240925 (https://download.01.org/0day-ci/archive/20240925/202409250753.7q3zl3b8-lkp@intel.com/config)
compiler: aarch64-linux-gcc (GCC) 14.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240925/202409250753.7q3zl3b8-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202409250753.7q3zl3b8-lkp@intel.com/

All errors (new ones prefixed by >>):

   drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c: In function 'arm_smmu_domain_alloc_user':
>> drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c:3066:24: error: returning 'struct arm_smmu_domain *' from a function with incompatible return type 'struct iommu_domain *' [-Wincompatible-pointer-types]
    3066 |                 return smmu_domain;
         |                        ^~~~~~~~~~~


vim +3066 drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c

  3048	
  3049	static struct iommu_domain *
  3050	arm_smmu_domain_alloc_user(struct device *dev, u32 flags,
  3051				   struct iommu_domain *parent,
  3052				   const struct iommu_user_data *user_data)
  3053	{
  3054		struct arm_smmu_master *master = dev_iommu_priv_get(dev);
  3055		const u32 PAGING_FLAGS = IOMMU_HWPT_ALLOC_DIRTY_TRACKING;
  3056		struct arm_smmu_domain *smmu_domain;
  3057		int ret;
  3058	
  3059		if (flags & ~PAGING_FLAGS)
  3060			return ERR_PTR(-EOPNOTSUPP);
  3061		if (parent || user_data)
  3062			return ERR_PTR(-EOPNOTSUPP);
  3063	
  3064		smmu_domain = arm_smmu_domain_alloc();
  3065		if (IS_ERR(smmu_domain))
> 3066			return smmu_domain;
  3067	
  3068		smmu_domain->domain.type = IOMMU_DOMAIN_UNMANAGED;
  3069		smmu_domain->domain.ops = arm_smmu_ops.default_domain_ops;
  3070		ret = arm_smmu_domain_finalise(smmu_domain, master->smmu, flags);
  3071		if (ret)
  3072			goto err_free;
  3073		return &smmu_domain->domain;
  3074	
  3075	err_free:
  3076		kfree(smmu_domain);
  3077		return ERR_PTR(ret);
  3078	}
  3079
kernel test robot Sept. 25, 2024, midnight UTC | #4
Hi Dipendra,

kernel test robot noticed the following build errors:

[auto build test ERROR on staging/staging-testing]

url:    https://github.com/intel-lab-lkp/linux/commits/Dipendra-Khadka/Staging-iommu-Replace-null-pointer-check-with-IS_ERR-in-arm_smmu_domain_alloc_user/20240922-235756
base:   staging/staging-testing
patch link:    https://lore.kernel.org/r/20240922155621.49432-1-kdipendra88%40gmail.com
patch subject: [PATCH] Staging: iommu:  Replace null pointer check with IS_ERR in arm_smmu_domain_alloc_user()
config: arm64-randconfig-003-20240925 (https://download.01.org/0day-ci/archive/20240925/202409250755.nLQtNlCf-lkp@intel.com/config)
compiler: clang version 20.0.0git (https://github.com/llvm/llvm-project 7773243d9916f98ba0ffce0c3a960e4aa9f03e81)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240925/202409250755.nLQtNlCf-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202409250755.nLQtNlCf-lkp@intel.com/

All errors (new ones prefixed by >>):

   In file included from drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c:15:
   In file included from include/linux/crash_dump.h:5:
   In file included from include/linux/kexec.h:18:
   In file included from include/linux/vmcore_info.h:6:
   In file included from include/linux/elfcore.h:11:
   In file included from include/linux/ptrace.h:10:
   In file included from include/linux/pid_namespace.h:7:
   In file included from include/linux/mm.h:2228:
   include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
     514 |         return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
         |                               ~~~~~~~~~~~ ^ ~~~
>> drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c:3066:10: error: incompatible pointer types returning 'struct arm_smmu_domain *' from a function with result type 'struct iommu_domain *' [-Werror,-Wincompatible-pointer-types]
    3066 |                 return smmu_domain;
         |                        ^~~~~~~~~~~
   1 warning and 1 error generated.


vim +3066 drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c

  3048	
  3049	static struct iommu_domain *
  3050	arm_smmu_domain_alloc_user(struct device *dev, u32 flags,
  3051				   struct iommu_domain *parent,
  3052				   const struct iommu_user_data *user_data)
  3053	{
  3054		struct arm_smmu_master *master = dev_iommu_priv_get(dev);
  3055		const u32 PAGING_FLAGS = IOMMU_HWPT_ALLOC_DIRTY_TRACKING;
  3056		struct arm_smmu_domain *smmu_domain;
  3057		int ret;
  3058	
  3059		if (flags & ~PAGING_FLAGS)
  3060			return ERR_PTR(-EOPNOTSUPP);
  3061		if (parent || user_data)
  3062			return ERR_PTR(-EOPNOTSUPP);
  3063	
  3064		smmu_domain = arm_smmu_domain_alloc();
  3065		if (IS_ERR(smmu_domain))
> 3066			return smmu_domain;
  3067	
  3068		smmu_domain->domain.type = IOMMU_DOMAIN_UNMANAGED;
  3069		smmu_domain->domain.ops = arm_smmu_ops.default_domain_ops;
  3070		ret = arm_smmu_domain_finalise(smmu_domain, master->smmu, flags);
  3071		if (ret)
  3072			goto err_free;
  3073		return &smmu_domain->domain;
  3074	
  3075	err_free:
  3076		kfree(smmu_domain);
  3077		return ERR_PTR(ret);
  3078	}
  3079
diff mbox series

Patch

diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
index a31460f9f3d4..19c53c6f7578 100644
--- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
+++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
@@ -3062,8 +3062,8 @@  arm_smmu_domain_alloc_user(struct device *dev, u32 flags,
 		return ERR_PTR(-EOPNOTSUPP);
 
 	smmu_domain = arm_smmu_domain_alloc();
-	if (!smmu_domain)
-		return ERR_PTR(-ENOMEM);
+	if (IS_ERR(smmu_domain))
+		return smmu_domain;
 
 	smmu_domain->domain.type = IOMMU_DOMAIN_UNMANAGED;
 	smmu_domain->domain.ops = arm_smmu_ops.default_domain_ops;