Staging driver fixes for 4.4-rc5
Here are a few staging and IIO driver fixes for 4.4-rc5. All of them resolve reported problems and have been in linux-next for a while. Nothing major here, just small fixes where needed. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iEYEABECAAYFAlZs8XoACgkQMUfUDdst+ylBOACgyDkTu3PMP0JXQkUQps5FFhz2 4gIAoJJei6yppBFqQZpWYIZgY9bt+08q =stnU -----END PGP SIGNATURE----- Merge tag 'staging-4.4-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging Pull staging driver fixes from Greg KH: "Here are a few staging and IIO driver fixes for 4.4-rc5. All of them resolve reported problems and have been in linux-next for a while. Nothing major here, just small fixes where needed" * tag 'staging-4.4-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging: staging: lustre: echo_copy.._lsm() dereferences userland pointers directly iio: adc: spmi-vadc: add missing of_node_put iio: fix some warning messages iio: light: apds9960: correct ->last_busy count iio: lidar: return -EINVAL on invalid signal staging: iio: dummy: complete IIO events delivery to userspace
This commit is contained in:
commit
b24f74e320
|
@ -839,8 +839,10 @@ static int vadc_get_dt_data(struct vadc_priv *vadc, struct device_node *node)
|
||||||
|
|
||||||
for_each_available_child_of_node(node, child) {
|
for_each_available_child_of_node(node, child) {
|
||||||
ret = vadc_get_dt_channel_data(vadc->dev, &prop, child);
|
ret = vadc_get_dt_channel_data(vadc->dev, &prop, child);
|
||||||
if (ret)
|
if (ret) {
|
||||||
|
of_node_put(child);
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
vadc->chan_props[index] = prop;
|
vadc->chan_props[index] = prop;
|
||||||
|
|
||||||
|
|
|
@ -302,7 +302,7 @@ static int iio_scan_mask_set(struct iio_dev *indio_dev,
|
||||||
if (trialmask == NULL)
|
if (trialmask == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
if (!indio_dev->masklength) {
|
if (!indio_dev->masklength) {
|
||||||
WARN_ON("Trying to set scanmask prior to registering buffer\n");
|
WARN(1, "Trying to set scanmask prior to registering buffer\n");
|
||||||
goto err_invalid_mask;
|
goto err_invalid_mask;
|
||||||
}
|
}
|
||||||
bitmap_copy(trialmask, buffer->scan_mask, indio_dev->masklength);
|
bitmap_copy(trialmask, buffer->scan_mask, indio_dev->masklength);
|
||||||
|
|
|
@ -655,7 +655,7 @@ int __iio_device_attr_init(struct device_attribute *dev_attr,
|
||||||
break;
|
break;
|
||||||
case IIO_SEPARATE:
|
case IIO_SEPARATE:
|
||||||
if (!chan->indexed) {
|
if (!chan->indexed) {
|
||||||
WARN_ON("Differential channels must be indexed\n");
|
WARN(1, "Differential channels must be indexed\n");
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto error_free_full_postfix;
|
goto error_free_full_postfix;
|
||||||
}
|
}
|
||||||
|
|
|
@ -453,6 +453,7 @@ static int apds9960_set_power_state(struct apds9960_data *data, bool on)
|
||||||
usleep_range(data->als_adc_int_us,
|
usleep_range(data->als_adc_int_us,
|
||||||
APDS9960_MAX_INT_TIME_IN_US);
|
APDS9960_MAX_INT_TIME_IN_US);
|
||||||
} else {
|
} else {
|
||||||
|
pm_runtime_mark_last_busy(dev);
|
||||||
ret = pm_runtime_put_autosuspend(dev);
|
ret = pm_runtime_put_autosuspend(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -130,10 +130,10 @@ static int lidar_get_measurement(struct lidar_data *data, u16 *reg)
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* return 0 since laser is likely pointed out of range */
|
/* return -EINVAL since laser is likely pointed out of range */
|
||||||
if (ret & LIDAR_REG_STATUS_INVALID) {
|
if (ret & LIDAR_REG_STATUS_INVALID) {
|
||||||
*reg = 0;
|
*reg = 0;
|
||||||
ret = 0;
|
ret = -EINVAL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,7 +197,7 @@ static irqreturn_t lidar_trigger_handler(int irq, void *private)
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
||||||
iio_get_time_ns());
|
iio_get_time_ns());
|
||||||
} else {
|
} else if (ret != -EINVAL) {
|
||||||
dev_err(&data->client->dev, "cannot read LIDAR measurement");
|
dev_err(&data->client->dev, "cannot read LIDAR measurement");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -159,7 +159,7 @@ static irqreturn_t iio_simple_dummy_get_timestamp(int irq, void *private)
|
||||||
struct iio_dummy_state *st = iio_priv(indio_dev);
|
struct iio_dummy_state *st = iio_priv(indio_dev);
|
||||||
|
|
||||||
st->event_timestamp = iio_get_time_ns();
|
st->event_timestamp = iio_get_time_ns();
|
||||||
return IRQ_HANDLED;
|
return IRQ_WAKE_THREAD;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1270,6 +1270,7 @@ static int
|
||||||
echo_copyout_lsm(struct lov_stripe_md *lsm, void *_ulsm, int ulsm_nob)
|
echo_copyout_lsm(struct lov_stripe_md *lsm, void *_ulsm, int ulsm_nob)
|
||||||
{
|
{
|
||||||
struct lov_stripe_md *ulsm = _ulsm;
|
struct lov_stripe_md *ulsm = _ulsm;
|
||||||
|
struct lov_oinfo **p;
|
||||||
int nob, i;
|
int nob, i;
|
||||||
|
|
||||||
nob = offsetof(struct lov_stripe_md, lsm_oinfo[lsm->lsm_stripe_count]);
|
nob = offsetof(struct lov_stripe_md, lsm_oinfo[lsm->lsm_stripe_count]);
|
||||||
|
@ -1279,9 +1280,10 @@ echo_copyout_lsm(struct lov_stripe_md *lsm, void *_ulsm, int ulsm_nob)
|
||||||
if (copy_to_user(ulsm, lsm, sizeof(*ulsm)))
|
if (copy_to_user(ulsm, lsm, sizeof(*ulsm)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
for (i = 0; i < lsm->lsm_stripe_count; i++) {
|
for (i = 0, p = lsm->lsm_oinfo; i < lsm->lsm_stripe_count; i++, p++) {
|
||||||
if (copy_to_user(ulsm->lsm_oinfo[i], lsm->lsm_oinfo[i],
|
struct lov_oinfo __user *up;
|
||||||
sizeof(lsm->lsm_oinfo[0])))
|
if (get_user(up, ulsm->lsm_oinfo + i) ||
|
||||||
|
copy_to_user(up, *p, sizeof(struct lov_oinfo)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1289,9 +1291,10 @@ echo_copyout_lsm(struct lov_stripe_md *lsm, void *_ulsm, int ulsm_nob)
|
||||||
|
|
||||||
static int
|
static int
|
||||||
echo_copyin_lsm(struct echo_device *ed, struct lov_stripe_md *lsm,
|
echo_copyin_lsm(struct echo_device *ed, struct lov_stripe_md *lsm,
|
||||||
void *ulsm, int ulsm_nob)
|
struct lov_stripe_md __user *ulsm, int ulsm_nob)
|
||||||
{
|
{
|
||||||
struct echo_client_obd *ec = ed->ed_ec;
|
struct echo_client_obd *ec = ed->ed_ec;
|
||||||
|
struct lov_oinfo **p;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (ulsm_nob < sizeof(*lsm))
|
if (ulsm_nob < sizeof(*lsm))
|
||||||
|
@ -1306,11 +1309,10 @@ echo_copyin_lsm(struct echo_device *ed, struct lov_stripe_md *lsm,
|
||||||
((__u64)lsm->lsm_stripe_size * lsm->lsm_stripe_count > ~0UL))
|
((__u64)lsm->lsm_stripe_size * lsm->lsm_stripe_count > ~0UL))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
for (i = 0; i < lsm->lsm_stripe_count; i++) {
|
for (i = 0, p = lsm->lsm_oinfo; i < lsm->lsm_stripe_count; i++, p++) {
|
||||||
if (copy_from_user(lsm->lsm_oinfo[i],
|
struct lov_oinfo __user *up;
|
||||||
((struct lov_stripe_md *)ulsm)-> \
|
if (get_user(up, ulsm->lsm_oinfo + i) ||
|
||||||
lsm_oinfo[i],
|
copy_from_user(*p, up, sizeof(struct lov_oinfo)))
|
||||||
sizeof(lsm->lsm_oinfo[0])))
|
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue