Unverified Commit 670bc4d3 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!11775 [sync] PR-11752: driver: iio: add missing checks on iio_info's callback access

parents 94125b27 a2daf154
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -684,9 +684,11 @@ static ssize_t iio_read_channel_info(struct device *dev,
							INDIO_MAX_RAW_ELEMENTS,
							vals, &val_len,
							this_attr->address);
	else
	else if (indio_dev->info->read_raw)
		ret = indio_dev->info->read_raw(indio_dev, this_attr->c,
				    &vals[0], &vals[1], this_attr->address);
	else
		return -EINVAL;

	if (ret < 0)
		return ret;
@@ -791,6 +793,9 @@ static ssize_t iio_read_channel_info_avail(struct device *dev,
	int length;
	int type;

	if (!indio_dev->info->read_avail)
		return -EINVAL;

	ret = indio_dev->info->read_avail(indio_dev, this_attr->c,
					  &vals, &type, &length,
					  this_attr->address);
+9 −0
Original line number Diff line number Diff line
@@ -274,6 +274,9 @@ static ssize_t iio_ev_state_store(struct device *dev,
	if (ret < 0)
		return ret;

	if (!indio_dev->info->write_event_config)
		return -EINVAL;

	ret = indio_dev->info->write_event_config(indio_dev,
		this_attr->c, iio_ev_attr_type(this_attr),
		iio_ev_attr_dir(this_attr), val);
@@ -289,6 +292,9 @@ static ssize_t iio_ev_state_show(struct device *dev,
	struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
	int val;

	if (!indio_dev->info->read_event_config)
		return -EINVAL;

	val = indio_dev->info->read_event_config(indio_dev,
		this_attr->c, iio_ev_attr_type(this_attr),
		iio_ev_attr_dir(this_attr));
@@ -307,6 +313,9 @@ static ssize_t iio_ev_value_show(struct device *dev,
	int val, val2, val_arr[2];
	int ret;

	if (!indio_dev->info->read_event_value)
		return -EINVAL;

	ret = indio_dev->info->read_event_value(indio_dev,
		this_attr->c, iio_ev_attr_type(this_attr),
		iio_ev_attr_dir(this_attr), iio_ev_attr_info(this_attr),
+24 −11
Original line number Diff line number Diff line
@@ -500,6 +500,7 @@ EXPORT_SYMBOL_GPL(devm_iio_channel_get_all);
static int iio_channel_read(struct iio_channel *chan, int *val, int *val2,
	enum iio_chan_info_enum info)
{
	const struct iio_info *iio_info = chan->indio_dev->info;
	int unused;
	int vals[INDIO_MAX_RAW_ELEMENTS];
	int ret;
@@ -511,15 +512,19 @@ static int iio_channel_read(struct iio_channel *chan, int *val, int *val2,
	if (!iio_channel_has_info(chan->channel, info))
		return -EINVAL;

	if (chan->indio_dev->info->read_raw_multi) {
		ret = chan->indio_dev->info->read_raw_multi(chan->indio_dev,
					chan->channel, INDIO_MAX_RAW_ELEMENTS,
	if (iio_info->read_raw_multi) {
		ret = iio_info->read_raw_multi(chan->indio_dev,
					       chan->channel,
					       INDIO_MAX_RAW_ELEMENTS,
					       vals, &val_len, info);
		*val = vals[0];
		*val2 = vals[1];
	} else
		ret = chan->indio_dev->info->read_raw(chan->indio_dev,
	} else if (iio_info->read_raw) {
		ret = iio_info->read_raw(chan->indio_dev,
					 chan->channel, val, val2, info);
	} else {
		return -EINVAL;
	}

	return ret;
}
@@ -720,11 +725,15 @@ static int iio_channel_read_avail(struct iio_channel *chan,
				  const int **vals, int *type, int *length,
				  enum iio_chan_info_enum info)
{
	const struct iio_info *iio_info = chan->indio_dev->info;

	if (!iio_channel_has_available(chan->channel, info))
		return -EINVAL;

	return chan->indio_dev->info->read_avail(chan->indio_dev, chan->channel,
	if (iio_info->read_avail)
		return iio_info->read_avail(chan->indio_dev, chan->channel,
					    vals, type, length, info);
	return -EINVAL;
}

int iio_read_avail_channel_attribute(struct iio_channel *chan,
@@ -852,8 +861,12 @@ EXPORT_SYMBOL_GPL(iio_get_channel_type);
static int iio_channel_write(struct iio_channel *chan, int val, int val2,
			     enum iio_chan_info_enum info)
{
	return chan->indio_dev->info->write_raw(chan->indio_dev,
	const struct iio_info *iio_info = chan->indio_dev->info;

	if (iio_info->write_raw)
		return iio_info->write_raw(chan->indio_dev,
					   chan->channel, val, val2, info);
	return -EINVAL;
}

int iio_write_channel_attribute(struct iio_channel *chan, int val, int val2,