Hi Nicolin,

I love your patch! Perhaps something to improve:

url:    
https://github.com/0day-ci/linux/commits/Nicolin-Chen/hwmon-ina3221-Implement-PM-runtime-to-save-power/20181018-010754
base:   
https://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git 
hwmon-next

smatch warnings:
drivers/hwmon/hwmon.c:631 __hwmon_device_register() warn: variable dereferenced 
before check 'dev' (see line 628)

# 
https://github.com/0day-ci/linux/commit/aa912316f2d30d4e699ac2f11b6197a4da011274
git remote add linux-review https://github.com/0day-ci/linux
git remote update linux-review
git checkout aa912316f2d30d4e699ac2f11b6197a4da011274
vim +/dev +631 drivers/hwmon/hwmon.c

d560168b Guenter Roeck    2015-08-26  562  
d560168b Guenter Roeck    2015-08-26  563  static struct device *
d560168b Guenter Roeck    2015-08-26  564  __hwmon_device_register(struct 
device *dev, const char *name, void *drvdata,
d560168b Guenter Roeck    2015-08-26  565                       const struct 
hwmon_chip_info *chip,
bab2243c Guenter Roeck    2013-07-06  566                       const struct 
attribute_group **groups)
1236441f Mark M. Hoffman  2005-07-15  567  {
bab2243c Guenter Roeck    2013-07-06  568       struct hwmon_device *hwdev;
d560168b Guenter Roeck    2015-08-26  569       struct device *hdev;
d560168b Guenter Roeck    2015-08-26  570       int i, j, err, id;
ded2b666 Mark M. Hoffman  2006-03-05  571  
74d3b641 Guenter Roeck    2017-01-27  572       /* Complain about invalid 
characters in hwmon name attribute */
648cd48c Guenter Roeck    2014-02-28  573       if (name && (!strlen(name) || 
strpbrk(name, "-* \t\n")))
74d3b641 Guenter Roeck    2017-01-27  574               dev_warn(dev,
74d3b641 Guenter Roeck    2017-01-27  575                        "hwmon: '%s' 
is not a valid name attribute, please fix\n",
74d3b641 Guenter Roeck    2017-01-27  576                        name);
648cd48c Guenter Roeck    2014-02-28  577  
4ca5f468 Jonathan Cameron 2011-10-31  578       id = ida_simple_get(&hwmon_ida, 
0, 0, GFP_KERNEL);
4ca5f468 Jonathan Cameron 2011-10-31  579       if (id < 0)
4ca5f468 Jonathan Cameron 2011-10-31  580               return ERR_PTR(id);
1236441f Mark M. Hoffman  2005-07-15  581  
bab2243c Guenter Roeck    2013-07-06  582       hwdev = kzalloc(sizeof(*hwdev), 
GFP_KERNEL);
bab2243c Guenter Roeck    2013-07-06  583       if (hwdev == NULL) {
bab2243c Guenter Roeck    2013-07-06  584               err = -ENOMEM;
bab2243c Guenter Roeck    2013-07-06  585               goto ida_remove;
bab2243c Guenter Roeck    2013-07-06  586       }
1236441f Mark M. Hoffman  2005-07-15  587  
d560168b Guenter Roeck    2015-08-26  588       hdev = &hwdev->dev;
d560168b Guenter Roeck    2015-08-26  589  
239552f4 Guenter Roeck    2016-10-16  590       if (chip) {
d560168b Guenter Roeck    2015-08-26  591               struct attribute 
**attrs;
b2a4cc3a Guenter Roeck    2016-10-16  592               int ngroups = 2; /* 
terminating NULL plus &hwdev->groups */
d560168b Guenter Roeck    2015-08-26  593  
d560168b Guenter Roeck    2015-08-26  594               if (groups)
d560168b Guenter Roeck    2015-08-26  595                       for (i = 0; 
groups[i]; i++)
d560168b Guenter Roeck    2015-08-26  596                               
ngroups++;
d560168b Guenter Roeck    2015-08-26  597  
d560168b Guenter Roeck    2015-08-26  598               hwdev->groups = 
devm_kcalloc(dev, ngroups, sizeof(*groups),
d560168b Guenter Roeck    2015-08-26  599                                       
     GFP_KERNEL);
38d8ed65 Colin Ian King   2016-10-23  600               if (!hwdev->groups) {
38d8ed65 Colin Ian King   2016-10-23  601                       err = -ENOMEM;
38d8ed65 Colin Ian King   2016-10-23  602                       goto free_hwmon;
38d8ed65 Colin Ian King   2016-10-23  603               }
d560168b Guenter Roeck    2015-08-26  604  
d560168b Guenter Roeck    2015-08-26  605               attrs = 
__hwmon_create_attrs(dev, drvdata, chip);
d560168b Guenter Roeck    2015-08-26  606               if (IS_ERR(attrs)) {
d560168b Guenter Roeck    2015-08-26  607                       err = 
PTR_ERR(attrs);
d560168b Guenter Roeck    2015-08-26  608                       goto free_hwmon;
d560168b Guenter Roeck    2015-08-26  609               }
d560168b Guenter Roeck    2015-08-26  610  
d560168b Guenter Roeck    2015-08-26  611               hwdev->group.attrs = 
attrs;
d560168b Guenter Roeck    2015-08-26  612               ngroups = 0;
d560168b Guenter Roeck    2015-08-26  613               
hwdev->groups[ngroups++] = &hwdev->group;
d560168b Guenter Roeck    2015-08-26  614  
d560168b Guenter Roeck    2015-08-26  615               if (groups) {
d560168b Guenter Roeck    2015-08-26  616                       for (i = 0; 
groups[i]; i++)
d560168b Guenter Roeck    2015-08-26  617                               
hwdev->groups[ngroups++] = groups[i];
d560168b Guenter Roeck    2015-08-26  618               }
d560168b Guenter Roeck    2015-08-26  619  
d560168b Guenter Roeck    2015-08-26  620               hdev->groups = 
hwdev->groups;
d560168b Guenter Roeck    2015-08-26  621       } else {
d560168b Guenter Roeck    2015-08-26  622               hdev->groups = groups;
d560168b Guenter Roeck    2015-08-26  623       }
d560168b Guenter Roeck    2015-08-26  624  
bab2243c Guenter Roeck    2013-07-06  625       hwdev->name = name;
d560168b Guenter Roeck    2015-08-26  626       hdev->class = &hwmon_class;
d560168b Guenter Roeck    2015-08-26  627       hdev->parent = dev;
aa912316 Nicolin Chen     2018-10-16 @628       hdev->driver = dev->driver;
                                                               ^^^^^^^^^^^
aa912316 Nicolin Chen     2018-10-16  629       hdev->power = dev->power;
                                                              ^^^^^^^^^^
aa912316 Nicolin Chen     2018-10-16  630       hdev->pm_domain = 
dev->pm_domain;
                                                                  ^^^^^^^^^^^^^^
The patch adds unchecked dereferences.

d560168b Guenter Roeck    2015-08-26 @631       hdev->of_node = dev ? 
dev->of_node : NULL;
                                                                ^^^
The old code checks for NULL.

d560168b Guenter Roeck    2015-08-26  632       hwdev->chip = chip;
d560168b Guenter Roeck    2015-08-26  633       dev_set_drvdata(hdev, drvdata);
d560168b Guenter Roeck    2015-08-26  634       dev_set_name(hdev, 
HWMON_ID_FORMAT, id);
d560168b Guenter Roeck    2015-08-26  635       err = device_register(hdev);
bab2243c Guenter Roeck    2013-07-06  636       if (err)
d560168b Guenter Roeck    2015-08-26  637               goto free_hwmon;
d560168b Guenter Roeck    2015-08-26  638  
319fe159 Guenter Roeck    2017-01-31  639       if (dev && chip && 
chip->ops->read &&
d560168b Guenter Roeck    2015-08-26  640           chip->info[0]->type == 
hwmon_chip &&
d560168b Guenter Roeck    2015-08-26  641           (chip->info[0]->config[0] & 
HWMON_C_REGISTER_TZ)) {
d560168b Guenter Roeck    2015-08-26  642               const struct 
hwmon_channel_info **info = chip->info;
d560168b Guenter Roeck    2015-08-26  643  
d560168b Guenter Roeck    2015-08-26  644               for (i = 1; info[i]; 
i++) {
d560168b Guenter Roeck    2015-08-26  645                       if 
(info[i]->type != hwmon_temp)
d560168b Guenter Roeck    2015-08-26  646                               
continue;
d560168b Guenter Roeck    2015-08-26  647  
d560168b Guenter Roeck    2015-08-26  648                       for (j = 0; 
info[i]->config[j]; j++) {
d560168b Guenter Roeck    2015-08-26  649                               if 
(!chip->ops->is_visible(drvdata, hwmon_temp,
d560168b Guenter Roeck    2015-08-26  650                                       
                   hwmon_temp_input, j))
d560168b Guenter Roeck    2015-08-26  651                                       
continue;
47c332de Linus Walleij    2017-12-05  652                               if 
(info[i]->config[j] & HWMON_T_INPUT) {
47c332de Linus Walleij    2017-12-05  653                                       
err = hwmon_thermal_add_sensor(dev,
47c332de Linus Walleij    2017-12-05  654                                       
                        hwdev, j);
47c332de Linus Walleij    2017-12-05  655                                       
if (err)
47c332de Linus Walleij    2017-12-05  656                                       
        goto free_device;
47c332de Linus Walleij    2017-12-05  657                               }
d560168b Guenter Roeck    2015-08-26  658                       }
d560168b Guenter Roeck    2015-08-26  659               }
d560168b Guenter Roeck    2015-08-26  660       }
bab2243c Guenter Roeck    2013-07-06  661  
d560168b Guenter Roeck    2015-08-26  662       return hdev;
bab2243c Guenter Roeck    2013-07-06  663  
47c332de Linus Walleij    2017-12-05  664  free_device:
47c332de Linus Walleij    2017-12-05  665       device_unregister(hdev);
d560168b Guenter Roeck    2015-08-26  666  free_hwmon:
bab2243c Guenter Roeck    2013-07-06  667       kfree(hwdev);
bab2243c Guenter Roeck    2013-07-06  668  ida_remove:
4ca5f468 Jonathan Cameron 2011-10-31  669       ida_simple_remove(&hwmon_ida, 
id);
bab2243c Guenter Roeck    2013-07-06  670       return ERR_PTR(err);
bab2243c Guenter Roeck    2013-07-06  671  }
d560168b Guenter Roeck    2015-08-26  672  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
_______________________________________________
kbuild mailing list
kbuild@lists.01.org
https://lists.01.org/mailman/listinfo/kbuild

Reply via email to