Skip to content

Commit ecf11d3

Browse files
committed
Merge tag 'char-misc-6.16-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc
Pull char / misc / IIO fixes from Greg KH: "Here are some char/misc/iio and other driver fixes for 6.16-rc7. Included in here are: - IIO driver fixes for reported problems - Interconnect driver fixes for reported problems - nvmem driver fixes - bunch of comedi driver fixes for long-term bugs - Kconfig dependancy fixes for mux drivers - other small driver fixes for reported problems. All of these have been in linux-next for a while with no reported problems" * tag 'char-misc-6.16-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (35 commits) nvmem: layouts: u-boot-env: remove crc32 endianness conversion misc: amd-sbi: Explicitly clear in/out arg "mb_in_out" misc: amd-sbi: Address copy_to/from_user() warning reported in smatch misc: amd-sbi: Address potential integer overflow issue reported in smatch comedi: comedi_test: Fix possible deletion of uninitialized timers comedi: Fix initialization of data for instructions that write to subdevice comedi: Fix use of uninitialized data in insn_rw_emulate_bits() comedi: das6402: Fix bit shift out of bounds comedi: aio_iiro_16: Fix bit shift out of bounds comedi: pcl812: Fix bit shift out of bounds comedi: das16m1: Fix bit shift out of bounds comedi: Fix some signed shift left operations comedi: Fail COMEDI_INSNLIST ioctl if n_insns is too large nvmem: imx-ocotp: fix MAC address byte length MAINTAINERS: add miscdevice Rust abstractions mux: mmio: Fix missing CONFIG_REGMAP_MMIO iio: dac: ad3530r: Fix incorrect masking for channels 4-7 in powerdown mode iio: adc: ad7380: fix adi,gain-milli property parsing iio: adc: ad7949: use spi_is_bpw_supported() iio: accel: fxls8962af: Fix use after free in fxls8962af_fifo_flush ...
2 parents 990b11a + 2d7521a commit ecf11d3

35 files changed

+213
-112
lines changed

Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -223,12 +223,6 @@ allOf:
223223
- required:
224224
- pwms
225225

226-
- oneOf:
227-
- required:
228-
- interrupts
229-
- required:
230-
- io-backends
231-
232226
- if:
233227
properties:
234228
compatible:

Documentation/devicetree/bindings/iio/gyroscope/invensense,mpu3050.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ properties:
2121
vlogic-supply: true
2222

2323
interrupts:
24-
minItems: 1
24+
maxItems: 1
2525
description:
2626
Interrupt mapping for the trigger interrupt from the internal oscillator.
2727

MAINTAINERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5570,6 +5570,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
55705570
F: drivers/char/
55715571
F: drivers/misc/
55725572
F: include/linux/miscdevice.h
5573+
F: rust/kernel/miscdevice.rs
55735574
F: samples/rust/rust_misc_device.rs
55745575
X: drivers/char/agp/
55755576
X: drivers/char/hw_random/

drivers/comedi/comedi_fops.c

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1556,21 +1556,27 @@ static int do_insnlist_ioctl(struct comedi_device *dev,
15561556
}
15571557

15581558
for (i = 0; i < n_insns; ++i) {
1559+
unsigned int n = insns[i].n;
1560+
15591561
if (insns[i].insn & INSN_MASK_WRITE) {
15601562
if (copy_from_user(data, insns[i].data,
1561-
insns[i].n * sizeof(unsigned int))) {
1563+
n * sizeof(unsigned int))) {
15621564
dev_dbg(dev->class_dev,
15631565
"copy_from_user failed\n");
15641566
ret = -EFAULT;
15651567
goto error;
15661568
}
1569+
if (n < MIN_SAMPLES) {
1570+
memset(&data[n], 0, (MIN_SAMPLES - n) *
1571+
sizeof(unsigned int));
1572+
}
15671573
}
15681574
ret = parse_insn(dev, insns + i, data, file);
15691575
if (ret < 0)
15701576
goto error;
15711577
if (insns[i].insn & INSN_MASK_READ) {
15721578
if (copy_to_user(insns[i].data, data,
1573-
insns[i].n * sizeof(unsigned int))) {
1579+
n * sizeof(unsigned int))) {
15741580
dev_dbg(dev->class_dev,
15751581
"copy_to_user failed\n");
15761582
ret = -EFAULT;
@@ -1589,6 +1595,16 @@ static int do_insnlist_ioctl(struct comedi_device *dev,
15891595
return i;
15901596
}
15911597

1598+
#define MAX_INSNS MAX_SAMPLES
1599+
static int check_insnlist_len(struct comedi_device *dev, unsigned int n_insns)
1600+
{
1601+
if (n_insns > MAX_INSNS) {
1602+
dev_dbg(dev->class_dev, "insnlist length too large\n");
1603+
return -EINVAL;
1604+
}
1605+
return 0;
1606+
}
1607+
15921608
/*
15931609
* COMEDI_INSN ioctl
15941610
* synchronous instruction
@@ -1633,6 +1649,10 @@ static int do_insn_ioctl(struct comedi_device *dev,
16331649
ret = -EFAULT;
16341650
goto error;
16351651
}
1652+
if (insn->n < MIN_SAMPLES) {
1653+
memset(&data[insn->n], 0,
1654+
(MIN_SAMPLES - insn->n) * sizeof(unsigned int));
1655+
}
16361656
}
16371657
ret = parse_insn(dev, insn, data, file);
16381658
if (ret < 0)
@@ -2239,6 +2259,9 @@ static long comedi_unlocked_ioctl(struct file *file, unsigned int cmd,
22392259
rc = -EFAULT;
22402260
break;
22412261
}
2262+
rc = check_insnlist_len(dev, insnlist.n_insns);
2263+
if (rc)
2264+
break;
22422265
insns = kcalloc(insnlist.n_insns, sizeof(*insns), GFP_KERNEL);
22432266
if (!insns) {
22442267
rc = -ENOMEM;
@@ -3142,6 +3165,9 @@ static int compat_insnlist(struct file *file, unsigned long arg)
31423165
if (copy_from_user(&insnlist32, compat_ptr(arg), sizeof(insnlist32)))
31433166
return -EFAULT;
31443167

3168+
rc = check_insnlist_len(dev, insnlist32.n_insns);
3169+
if (rc)
3170+
return rc;
31453171
insns = kcalloc(insnlist32.n_insns, sizeof(*insns), GFP_KERNEL);
31463172
if (!insns)
31473173
return -ENOMEM;

drivers/comedi/drivers.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -339,10 +339,10 @@ int comedi_dio_insn_config(struct comedi_device *dev,
339339
unsigned int *data,
340340
unsigned int mask)
341341
{
342-
unsigned int chan_mask = 1 << CR_CHAN(insn->chanspec);
342+
unsigned int chan = CR_CHAN(insn->chanspec);
343343

344-
if (!mask)
345-
mask = chan_mask;
344+
if (!mask && chan < 32)
345+
mask = 1U << chan;
346346

347347
switch (data[0]) {
348348
case INSN_CONFIG_DIO_INPUT:
@@ -382,7 +382,7 @@ EXPORT_SYMBOL_GPL(comedi_dio_insn_config);
382382
unsigned int comedi_dio_update_state(struct comedi_subdevice *s,
383383
unsigned int *data)
384384
{
385-
unsigned int chanmask = (s->n_chan < 32) ? ((1 << s->n_chan) - 1)
385+
unsigned int chanmask = (s->n_chan < 32) ? ((1U << s->n_chan) - 1)
386386
: 0xffffffff;
387387
unsigned int mask = data[0] & chanmask;
388388
unsigned int bits = data[1];
@@ -615,6 +615,9 @@ static int insn_rw_emulate_bits(struct comedi_device *dev,
615615
unsigned int _data[2];
616616
int ret;
617617

618+
if (insn->n == 0)
619+
return 0;
620+
618621
memset(_data, 0, sizeof(_data));
619622
memset(&_insn, 0, sizeof(_insn));
620623
_insn.insn = INSN_BITS;
@@ -625,8 +628,8 @@ static int insn_rw_emulate_bits(struct comedi_device *dev,
625628
if (insn->insn == INSN_WRITE) {
626629
if (!(s->subdev_flags & SDF_WRITABLE))
627630
return -EINVAL;
628-
_data[0] = 1 << (chan - base_chan); /* mask */
629-
_data[1] = data[0] ? (1 << (chan - base_chan)) : 0; /* bits */
631+
_data[0] = 1U << (chan - base_chan); /* mask */
632+
_data[1] = data[0] ? (1U << (chan - base_chan)) : 0; /* bits */
630633
}
631634

632635
ret = s->insn_bits(dev, s, &_insn, _data);
@@ -709,7 +712,7 @@ static int __comedi_device_postconfig(struct comedi_device *dev)
709712

710713
if (s->type == COMEDI_SUBD_DO) {
711714
if (s->n_chan < 32)
712-
s->io_bits = (1 << s->n_chan) - 1;
715+
s->io_bits = (1U << s->n_chan) - 1;
713716
else
714717
s->io_bits = 0xffffffff;
715718
}

drivers/comedi/drivers/aio_iiro_16.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,8 @@ static int aio_iiro_16_attach(struct comedi_device *dev,
177177
* Digital input change of state interrupts are optionally supported
178178
* using IRQ 2-7, 10-12, 14, or 15.
179179
*/
180-
if ((1 << it->options[1]) & 0xdcfc) {
180+
if (it->options[1] > 0 && it->options[1] < 16 &&
181+
(1 << it->options[1]) & 0xdcfc) {
181182
ret = request_irq(it->options[1], aio_iiro_16_cos, 0,
182183
dev->board_name, dev);
183184
if (ret == 0)

drivers/comedi/drivers/comedi_test.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -792,7 +792,7 @@ static void waveform_detach(struct comedi_device *dev)
792792
{
793793
struct waveform_private *devpriv = dev->private;
794794

795-
if (devpriv) {
795+
if (devpriv && dev->n_subdevices) {
796796
timer_delete_sync(&devpriv->ai_timer);
797797
timer_delete_sync(&devpriv->ao_timer);
798798
}

drivers/comedi/drivers/das16m1.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,8 @@ static int das16m1_attach(struct comedi_device *dev,
522522
devpriv->extra_iobase = dev->iobase + DAS16M1_8255_IOBASE;
523523

524524
/* only irqs 2, 3, 4, 5, 6, 7, 10, 11, 12, 14, and 15 are valid */
525-
if ((1 << it->options[1]) & 0xdcfc) {
525+
if (it->options[1] >= 2 && it->options[1] <= 15 &&
526+
(1 << it->options[1]) & 0xdcfc) {
526527
ret = request_irq(it->options[1], das16m1_interrupt, 0,
527528
dev->board_name, dev);
528529
if (ret == 0)

drivers/comedi/drivers/das6402.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,8 @@ static int das6402_attach(struct comedi_device *dev,
567567
das6402_reset(dev);
568568

569569
/* IRQs 2,3,5,6,7, 10,11,15 are valid for "enhanced" mode */
570-
if ((1 << it->options[1]) & 0x8cec) {
570+
if (it->options[1] > 0 && it->options[1] < 16 &&
571+
(1 << it->options[1]) & 0x8cec) {
571572
ret = request_irq(it->options[1], das6402_interrupt, 0,
572573
dev->board_name, dev);
573574
if (ret == 0) {

drivers/comedi/drivers/pcl812.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1149,7 +1149,8 @@ static int pcl812_attach(struct comedi_device *dev, struct comedi_devconfig *it)
11491149
if (IS_ERR(dev->pacer))
11501150
return PTR_ERR(dev->pacer);
11511151

1152-
if ((1 << it->options[1]) & board->irq_bits) {
1152+
if (it->options[1] > 0 && it->options[1] < 16 &&
1153+
(1 << it->options[1]) & board->irq_bits) {
11531154
ret = request_irq(it->options[1], pcl812_interrupt, 0,
11541155
dev->board_name, dev);
11551156
if (ret == 0)

0 commit comments

Comments
 (0)