[staging:staging-testing 412/420] drivers/staging/most/mostcore/core.c:978 store_add_link() error: strlcpy() 'buffer' too small (80 vs u32max)
Dan Carpenter
dan.carpenter at oracle.com
Mon Jul 27 09:17:20 UTC 2015
tree: git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git staging-testing
head: 59cc3399efd61fabb7f4aa23d4498bd9b01e5f6d
commit: 57562a72414ca35b2e614cfe0a1b1a7b7e7813dd [412/420] Staging: most: add MOST driver's core module
drivers/staging/most/mostcore/core.c:978 store_add_link() error: strlcpy() 'buffer' too small (80 vs u32max)
drivers/staging/most/mostcore/core.c:986 store_add_link() error: snprintf() is printing too much 4096 vs 80
drivers/staging/most/mostcore/core.c:1041 store_remove_link() error: strlcpy() 'buffer' too small (80 vs u32max)
git remote add staging git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
git remote update staging
git checkout 57562a72414ca35b2e614cfe0a1b1a7b7e7813dd
vim +/buffer +978 drivers/staging/most/mostcore/core.c
57562a72 Christian Gromm 2015-07-24 972 char *mdev_ch;
57562a72 Christian Gromm 2015-07-24 973 char *mdev_devnod;
57562a72 Christian Gromm 2015-07-24 974 char devnod_buf[STRING_SIZE];
57562a72 Christian Gromm 2015-07-24 975 int ret;
57562a72 Christian Gromm 2015-07-24 976 unsigned int max_len = min((int)len + 1, STRING_SIZE);
57562a72 Christian Gromm 2015-07-24 977
57562a72 Christian Gromm 2015-07-24 @978 strlcpy(buffer, buf, max_len);
Here Smatch is complaining that the min() casting is bad. A high value
of "len" is casted to negative and thus the minimum resulting in memory
corruption. If you have the cross function database built up it won't
complain because "len" can't be negative.
57562a72 Christian Gromm 2015-07-24 979 strlcpy(aim_obj->add_link, buf, max_len);
57562a72 Christian Gromm 2015-07-24 980
57562a72 Christian Gromm 2015-07-24 981 ret = split_string(buffer, &mdev, &mdev_ch, &mdev_devnod);
57562a72 Christian Gromm 2015-07-24 982 if (ret)
57562a72 Christian Gromm 2015-07-24 983 return ret;
57562a72 Christian Gromm 2015-07-24 984
57562a72 Christian Gromm 2015-07-24 985 if (mdev_devnod == 0 || *mdev_devnod == 0) {
57562a72 Christian Gromm 2015-07-24 @986 snprintf(devnod_buf, PAGE_SIZE, "%s-%s", mdev, mdev_ch);
The PAGE_SIZE should be "sizeof(devnod_buf)". This is a bug.
57562a72 Christian Gromm 2015-07-24 987 mdev_devnod = devnod_buf;
57562a72 Christian Gromm 2015-07-24 988 }
57562a72 Christian Gromm 2015-07-24 989
57562a72 Christian Gromm 2015-07-24 990 c = get_channel_by_name(mdev, mdev_ch);
57562a72 Christian Gromm 2015-07-24 991 if (IS_ERR(c))
57562a72 Christian Gromm 2015-07-24 992 return -ENODEV;
57562a72 Christian Gromm 2015-07-24 993
57562a72 Christian Gromm 2015-07-24 994 if (!c->first_aim)
57562a72 Christian Gromm 2015-07-24 995 aim_ptr = &c->first_aim;
57562a72 Christian Gromm 2015-07-24 996 else if (!c->second_aim)
57562a72 Christian Gromm 2015-07-24 997 aim_ptr = &c->second_aim;
57562a72 Christian Gromm 2015-07-24 998 else
57562a72 Christian Gromm 2015-07-24 999 return -ENOSPC;
57562a72 Christian Gromm 2015-07-24 1000
57562a72 Christian Gromm 2015-07-24 1001 ret = aim_obj->driver->probe_channel(c->iface, c->channel_id,
57562a72 Christian Gromm 2015-07-24 1002 &c->cfg, &c->kobj, mdev_devnod);
57562a72 Christian Gromm 2015-07-24 1003 if (ret)
57562a72 Christian Gromm 2015-07-24 1004 return ret;
57562a72 Christian Gromm 2015-07-24 1005 *aim_ptr = aim_obj->driver;
57562a72 Christian Gromm 2015-07-24 1006 return len;
57562a72 Christian Gromm 2015-07-24 1007 }
57562a72 Christian Gromm 2015-07-24 1008
57562a72 Christian Gromm 2015-07-24 1009 struct most_aim_attribute most_aim_attr_add_link =
57562a72 Christian Gromm 2015-07-24 1010 __ATTR(add_link, S_IRUGO | S_IWUSR, show_add_link, store_add_link);
57562a72 Christian Gromm 2015-07-24 1011
57562a72 Christian Gromm 2015-07-24 1012 static ssize_t show_remove_link(struct most_aim_obj *aim_obj,
57562a72 Christian Gromm 2015-07-24 1013 struct most_aim_attribute *attr,
57562a72 Christian Gromm 2015-07-24 1014 char *buf)
57562a72 Christian Gromm 2015-07-24 1015 {
57562a72 Christian Gromm 2015-07-24 1016 return snprintf(buf, PAGE_SIZE, "%s\n", aim_obj->remove_link);
57562a72 Christian Gromm 2015-07-24 1017 }
57562a72 Christian Gromm 2015-07-24 1018
57562a72 Christian Gromm 2015-07-24 1019 /**
57562a72 Christian Gromm 2015-07-24 1020 * store_remove_link - store function for remove_link attribute
57562a72 Christian Gromm 2015-07-24 1021 * @aim_obj: pointer to AIM object
57562a72 Christian Gromm 2015-07-24 1022 * @attr: its attributes
57562a72 Christian Gromm 2015-07-24 1023 * @buf: buffer
57562a72 Christian Gromm 2015-07-24 1024 * @len: buffer length
57562a72 Christian Gromm 2015-07-24 1025 *
57562a72 Christian Gromm 2015-07-24 1026 * Example:
57562a72 Christian Gromm 2015-07-24 1027 * echo -n -e "mdev0:ch0 at ep_81\n" >remove_link
57562a72 Christian Gromm 2015-07-24 1028 */
57562a72 Christian Gromm 2015-07-24 1029 static ssize_t store_remove_link(struct most_aim_obj *aim_obj,
57562a72 Christian Gromm 2015-07-24 1030 struct most_aim_attribute *attr,
57562a72 Christian Gromm 2015-07-24 1031 const char *buf,
57562a72 Christian Gromm 2015-07-24 1032 size_t len)
57562a72 Christian Gromm 2015-07-24 1033 {
57562a72 Christian Gromm 2015-07-24 1034 struct most_c_obj *c;
57562a72 Christian Gromm 2015-07-24 1035 char buffer[STRING_SIZE];
57562a72 Christian Gromm 2015-07-24 1036 char *mdev;
57562a72 Christian Gromm 2015-07-24 1037 char *mdev_ch;
57562a72 Christian Gromm 2015-07-24 1038 int ret;
57562a72 Christian Gromm 2015-07-24 1039 unsigned int max_len = min((int)len + 1, STRING_SIZE);
57562a72 Christian Gromm 2015-07-24 1040
57562a72 Christian Gromm 2015-07-24 @1041 strlcpy(buffer, buf, max_len);
Same casting of high values to negative.
57562a72 Christian Gromm 2015-07-24 1042 strlcpy(aim_obj->remove_link, buf, max_len);
57562a72 Christian Gromm 2015-07-24 1043 ret = split_string(buffer, &mdev, &mdev_ch, NULL);
57562a72 Christian Gromm 2015-07-24 1044 if (ret)
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
More information about the devel
mailing list