Hi Drew,

url:    
https://github.com/0day-ci/linux/commits/Drew-Fustini/pinctrl-pinmux-Add-pinmux-select-debugfs-file/20210210-160108
base:   
https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl.git devel
config: i386-randconfig-m021-20210209 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <l...@intel.com>
Reported-by: Dan Carpenter <dan.carpen...@oracle.com>

smatch warnings:
drivers/pinctrl/pinmux.c:762 pinmux_select() error: uninitialized symbol 
'gname'.

vim +/gname +762 drivers/pinctrl/pinmux.c

99b2f99aa41aa7 Drew Fustini  2021-02-09  678  static ssize_t 
pinmux_select(struct file *file, const char __user *user_buf,
99b2f99aa41aa7 Drew Fustini  2021-02-09  679                               
size_t len, loff_t *ppos)
99b2f99aa41aa7 Drew Fustini  2021-02-09  680  {
99b2f99aa41aa7 Drew Fustini  2021-02-09  681    struct seq_file *sfile = 
file->private_data;
99b2f99aa41aa7 Drew Fustini  2021-02-09  682    struct pinctrl_dev *pctldev = 
sfile->private;
99b2f99aa41aa7 Drew Fustini  2021-02-09  683    const struct pinmux_ops *pmxops 
= pctldev->desc->pmxops;
99b2f99aa41aa7 Drew Fustini  2021-02-09  684    const char *const *groups;
99b2f99aa41aa7 Drew Fustini  2021-02-09  685    char *buf, *fname, *gname;
99b2f99aa41aa7 Drew Fustini  2021-02-09  686    unsigned int num_groups;
99b2f99aa41aa7 Drew Fustini  2021-02-09  687    int fsel, gsel, ret;
99b2f99aa41aa7 Drew Fustini  2021-02-09  688  
99b2f99aa41aa7 Drew Fustini  2021-02-09  689    if (len > (PINMUX_MAX_NAME * 
2)) {
99b2f99aa41aa7 Drew Fustini  2021-02-09  690            dev_err(pctldev->dev, 
"write too big for buffer");
99b2f99aa41aa7 Drew Fustini  2021-02-09  691            return -EINVAL;
99b2f99aa41aa7 Drew Fustini  2021-02-09  692    }
99b2f99aa41aa7 Drew Fustini  2021-02-09  693  
99b2f99aa41aa7 Drew Fustini  2021-02-09  694    buf = 
devm_kzalloc(pctldev->dev, PINMUX_MAX_NAME * 2, GFP_KERNEL);
99b2f99aa41aa7 Drew Fustini  2021-02-09  695    if (!buf)
99b2f99aa41aa7 Drew Fustini  2021-02-09  696            return -ENOMEM;
99b2f99aa41aa7 Drew Fustini  2021-02-09  697  
99b2f99aa41aa7 Drew Fustini  2021-02-09  698    fname = 
devm_kzalloc(pctldev->dev, PINMUX_MAX_NAME, GFP_KERNEL);
99b2f99aa41aa7 Drew Fustini  2021-02-09  699    if (!fname) {
99b2f99aa41aa7 Drew Fustini  2021-02-09  700            ret = -ENOMEM;
99b2f99aa41aa7 Drew Fustini  2021-02-09  701            goto free_buf;

The gotos are out of order.  They should be in mirror/reverse order of
the allocations:

free_gmane:
        devm_kfree(pctldev->dev, gname);
free_fname:
        devm_kfree(pctldev->dev, fname);
free_buf:
        devm_kfree(pctldev->dev, buf);

But also why do we need to use devm_kfree() at all?  I thought the whole
point of devm_ functions was that they are garbage collected
automatically for you.  Can we not just delete all error handling and
return -ENOMEM here?

99b2f99aa41aa7 Drew Fustini  2021-02-09  702    }
99b2f99aa41aa7 Drew Fustini  2021-02-09  703  
99b2f99aa41aa7 Drew Fustini  2021-02-09  704    gname = 
devm_kzalloc(pctldev->dev, PINMUX_MAX_NAME, GFP_KERNEL);
99b2f99aa41aa7 Drew Fustini  2021-02-09  705    if (!buf) {
99b2f99aa41aa7 Drew Fustini  2021-02-09  706            ret = -ENOMEM;
99b2f99aa41aa7 Drew Fustini  2021-02-09  707            goto free_fname;
99b2f99aa41aa7 Drew Fustini  2021-02-09  708    }
99b2f99aa41aa7 Drew Fustini  2021-02-09  709  
99b2f99aa41aa7 Drew Fustini  2021-02-09  710    ret = strncpy_from_user(buf, 
user_buf, PINMUX_MAX_NAME * 2);
99b2f99aa41aa7 Drew Fustini  2021-02-09  711    if (ret < 0) {
99b2f99aa41aa7 Drew Fustini  2021-02-09  712            dev_err(pctldev->dev, 
"failed to copy buffer from userspace");
99b2f99aa41aa7 Drew Fustini  2021-02-09  713            goto free_gname;
99b2f99aa41aa7 Drew Fustini  2021-02-09  714    }
99b2f99aa41aa7 Drew Fustini  2021-02-09  715    buf[len-1] = '\0';
99b2f99aa41aa7 Drew Fustini  2021-02-09  716  
99b2f99aa41aa7 Drew Fustini  2021-02-09  717    ret = sscanf(buf, "%s %s", 
fname, gname);
99b2f99aa41aa7 Drew Fustini  2021-02-09  718    if (ret != 2) {
99b2f99aa41aa7 Drew Fustini  2021-02-09  719            dev_err(pctldev->dev, 
"expected format: <function-name> <group-name>");
99b2f99aa41aa7 Drew Fustini  2021-02-09  720            goto free_gname;
99b2f99aa41aa7 Drew Fustini  2021-02-09  721    }
99b2f99aa41aa7 Drew Fustini  2021-02-09  722  
99b2f99aa41aa7 Drew Fustini  2021-02-09  723    fsel = 
pinmux_func_name_to_selector(pctldev, fname);
99b2f99aa41aa7 Drew Fustini  2021-02-09  724    if (fsel < 0) {
99b2f99aa41aa7 Drew Fustini  2021-02-09  725            dev_err(pctldev->dev, 
"invalid function %s in map table\n", fname);
99b2f99aa41aa7 Drew Fustini  2021-02-09  726            ret = -EINVAL;
99b2f99aa41aa7 Drew Fustini  2021-02-09  727            goto free_gname;
99b2f99aa41aa7 Drew Fustini  2021-02-09  728    }
99b2f99aa41aa7 Drew Fustini  2021-02-09  729  
99b2f99aa41aa7 Drew Fustini  2021-02-09  730    ret = 
pmxops->get_function_groups(pctldev, fsel, &groups, &num_groups);
99b2f99aa41aa7 Drew Fustini  2021-02-09  731    if (ret) {
99b2f99aa41aa7 Drew Fustini  2021-02-09  732            dev_err(pctldev->dev, 
"no groups for function %d (%s)", fsel, fname);
99b2f99aa41aa7 Drew Fustini  2021-02-09  733            goto free_gname;
99b2f99aa41aa7 Drew Fustini  2021-02-09  734  
99b2f99aa41aa7 Drew Fustini  2021-02-09  735    }
99b2f99aa41aa7 Drew Fustini  2021-02-09  736  
99b2f99aa41aa7 Drew Fustini  2021-02-09  737    ret = match_string(groups, 
num_groups, gname);
99b2f99aa41aa7 Drew Fustini  2021-02-09  738    if (ret < 0) {
99b2f99aa41aa7 Drew Fustini  2021-02-09  739            dev_err(pctldev->dev, 
"invalid group %s", gname);
99b2f99aa41aa7 Drew Fustini  2021-02-09  740            goto free_gname;
99b2f99aa41aa7 Drew Fustini  2021-02-09  741    }
99b2f99aa41aa7 Drew Fustini  2021-02-09  742  
99b2f99aa41aa7 Drew Fustini  2021-02-09  743    ret = 
pinctrl_get_group_selector(pctldev, gname);
99b2f99aa41aa7 Drew Fustini  2021-02-09  744    if (ret < 0) {
99b2f99aa41aa7 Drew Fustini  2021-02-09  745            dev_err(pctldev->dev, 
"failed to get group selectorL %s", gname);
99b2f99aa41aa7 Drew Fustini  2021-02-09  746            goto free_gname;
99b2f99aa41aa7 Drew Fustini  2021-02-09  747    }
99b2f99aa41aa7 Drew Fustini  2021-02-09  748    gsel = ret;
99b2f99aa41aa7 Drew Fustini  2021-02-09  749  
99b2f99aa41aa7 Drew Fustini  2021-02-09  750    ret = pmxops->set_mux(pctldev, 
fsel, gsel);
99b2f99aa41aa7 Drew Fustini  2021-02-09  751    if (ret) {
99b2f99aa41aa7 Drew Fustini  2021-02-09  752            dev_err(pctldev->dev, 
"set_mux() failed: %d", ret);
99b2f99aa41aa7 Drew Fustini  2021-02-09  753            goto free_gname;
99b2f99aa41aa7 Drew Fustini  2021-02-09  754    }
99b2f99aa41aa7 Drew Fustini  2021-02-09  755  
99b2f99aa41aa7 Drew Fustini  2021-02-09  756    return len;
99b2f99aa41aa7 Drew Fustini  2021-02-09  757  free_buf:
99b2f99aa41aa7 Drew Fustini  2021-02-09  758    devm_kfree(pctldev->dev, buf);
99b2f99aa41aa7 Drew Fustini  2021-02-09  759  free_fname:
99b2f99aa41aa7 Drew Fustini  2021-02-09  760    devm_kfree(pctldev->dev, fname);
99b2f99aa41aa7 Drew Fustini  2021-02-09  761  free_gname:
99b2f99aa41aa7 Drew Fustini  2021-02-09 @762    devm_kfree(pctldev->dev, gname);
99b2f99aa41aa7 Drew Fustini  2021-02-09  763    return ret;
99b2f99aa41aa7 Drew Fustini  2021-02-09  764  }

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-...@lists.01.org

Attachment: .config.gz
Description: application/gzip

Reply via email to