Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Input: do not use WARN() in input_alloc_absinfo()

Some of fuzzers set panic_on_warn=1 so that they can handle WARN()ings
the same way they handle full-blown kernel crashes. We used WARN() in
input_alloc_absinfo() to get a better idea where memory allocation
failed, but since then kmalloc() and friends started dumping call stack on
memory allocation failures anyway, so we are not getting anything extra
from WARN().

Because of the above, let's replace WARN with dev_err(). We use dev_err()
instead of simply removing message and relying on kcalloc() to give us
stack dump so that we'd know the instance of hardware device to which we
were trying to attach input device.

Reported-by: Dmitry Vyukov <dvyukov@google.com>
Acked-by: Dmitry Vyukov <dvyukov@google.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

+12 -4
+12 -4
drivers/input/input.c
··· 480 480 */ 481 481 void input_alloc_absinfo(struct input_dev *dev) 482 482 { 483 - if (!dev->absinfo) 484 - dev->absinfo = kcalloc(ABS_CNT, sizeof(*dev->absinfo), 485 - GFP_KERNEL); 483 + if (dev->absinfo) 484 + return; 486 485 487 - WARN(!dev->absinfo, "%s(): kcalloc() failed?\n", __func__); 486 + dev->absinfo = kcalloc(ABS_CNT, sizeof(*dev->absinfo), GFP_KERNEL); 487 + if (!dev->absinfo) { 488 + dev_err(dev->dev.parent ?: &dev->dev, 489 + "%s: unable to allocate memory\n", __func__); 490 + /* 491 + * We will handle this allocation failure in 492 + * input_register_device() when we refuse to register input 493 + * device with ABS bits but without absinfo. 494 + */ 495 + } 488 496 } 489 497 EXPORT_SYMBOL(input_alloc_absinfo); 490 498