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 |
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
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
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
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 --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;
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(-)