1. 11 12月, 2020 1 次提交
  2. 02 10月, 2020 2 次提交
    • J
      drivers core: Miscellaneous changes for sysfs_emit · 948b3edb
      Joe Perches 提交于
      Change additional instances that could use sysfs_emit and sysfs_emit_at
      that the coccinelle script could not convert.
      
      o macros creating show functions with ## concatenation
      o unbound sprintf uses with buf+len for start of output to sysfs_emit_at
      o returns with ?: tests and sprintf to sysfs_emit
      o sysfs output with struct class * not struct device * arguments
      
      Miscellanea:
      
      o remove unnecessary initializations around these changes
      o consistently use int len for return length of show functions
      o use octal permissions and not S_<FOO>
      o rename a few show function names so DEVICE_ATTR_<FOO> can be used
      o use DEVICE_ATTR_ADMIN_RO where appropriate
      o consistently use const char *output for strings
      o checkpatch/style neatening
      Signed-off-by: NJoe Perches <joe@perches.com>
      Link: https://lore.kernel.org/r/8bc24444fe2049a9b2de6127389b57edfdfe324d.1600285923.git.joe@perches.comSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      948b3edb
    • J
      drivers core: Use sysfs_emit and sysfs_emit_at for show(device *...) functions · aa838896
      Joe Perches 提交于
      Convert the various sprintf fmaily calls in sysfs device show functions
      to sysfs_emit and sysfs_emit_at for PAGE_SIZE buffer safety.
      
      Done with:
      
      $ spatch -sp-file sysfs_emit_dev.cocci --in-place --max-width=80 .
      
      And cocci script:
      
      $ cat sysfs_emit_dev.cocci
      @@
      identifier d_show;
      identifier dev, attr, buf;
      @@
      
      ssize_t d_show(struct device *dev, struct device_attribute *attr, char *buf)
      {
      	<...
      	return
      -	sprintf(buf,
      +	sysfs_emit(buf,
      	...);
      	...>
      }
      
      @@
      identifier d_show;
      identifier dev, attr, buf;
      @@
      
      ssize_t d_show(struct device *dev, struct device_attribute *attr, char *buf)
      {
      	<...
      	return
      -	snprintf(buf, PAGE_SIZE,
      +	sysfs_emit(buf,
      	...);
      	...>
      }
      
      @@
      identifier d_show;
      identifier dev, attr, buf;
      @@
      
      ssize_t d_show(struct device *dev, struct device_attribute *attr, char *buf)
      {
      	<...
      	return
      -	scnprintf(buf, PAGE_SIZE,
      +	sysfs_emit(buf,
      	...);
      	...>
      }
      
      @@
      identifier d_show;
      identifier dev, attr, buf;
      expression chr;
      @@
      
      ssize_t d_show(struct device *dev, struct device_attribute *attr, char *buf)
      {
      	<...
      	return
      -	strcpy(buf, chr);
      +	sysfs_emit(buf, chr);
      	...>
      }
      
      @@
      identifier d_show;
      identifier dev, attr, buf;
      identifier len;
      @@
      
      ssize_t d_show(struct device *dev, struct device_attribute *attr, char *buf)
      {
      	<...
      	len =
      -	sprintf(buf,
      +	sysfs_emit(buf,
      	...);
      	...>
      	return len;
      }
      
      @@
      identifier d_show;
      identifier dev, attr, buf;
      identifier len;
      @@
      
      ssize_t d_show(struct device *dev, struct device_attribute *attr, char *buf)
      {
      	<...
      	len =
      -	snprintf(buf, PAGE_SIZE,
      +	sysfs_emit(buf,
      	...);
      	...>
      	return len;
      }
      
      @@
      identifier d_show;
      identifier dev, attr, buf;
      identifier len;
      @@
      
      ssize_t d_show(struct device *dev, struct device_attribute *attr, char *buf)
      {
      	<...
      	len =
      -	scnprintf(buf, PAGE_SIZE,
      +	sysfs_emit(buf,
      	...);
      	...>
      	return len;
      }
      
      @@
      identifier d_show;
      identifier dev, attr, buf;
      identifier len;
      @@
      
      ssize_t d_show(struct device *dev, struct device_attribute *attr, char *buf)
      {
      	<...
      -	len += scnprintf(buf + len, PAGE_SIZE - len,
      +	len += sysfs_emit_at(buf, len,
      	...);
      	...>
      	return len;
      }
      
      @@
      identifier d_show;
      identifier dev, attr, buf;
      expression chr;
      @@
      
      ssize_t d_show(struct device *dev, struct device_attribute *attr, char *buf)
      {
      	...
      -	strcpy(buf, chr);
      -	return strlen(buf);
      +	return sysfs_emit(buf, chr);
      }
      Signed-off-by: NJoe Perches <joe@perches.com>
      Link: https://lore.kernel.org/r/3d033c33056d88bbe34d4ddb62afd05ee166ab9a.1600285923.git.joe@perches.comSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      aa838896
  3. 11 9月, 2020 2 次提交
  4. 10 7月, 2020 1 次提交
  5. 07 7月, 2020 1 次提交
  6. 21 5月, 2020 1 次提交
  7. 12 5月, 2020 1 次提交
  8. 05 5月, 2020 1 次提交
    • K
      drivers: base: Fix NULL pointer exception in __platform_driver_probe() if a... · 388bcc6e
      Kuppuswamy Sathyanarayanan 提交于
      drivers: base: Fix NULL pointer exception in __platform_driver_probe() if a driver developer is foolish
      
      If platform bus driver registration is failed then, accessing
      platform bus spin lock (&drv->driver.bus->p->klist_drivers.k_lock)
      in __platform_driver_probe() without verifying the return value
      __platform_driver_register() can lead to NULL pointer exception.
      
      So check the return value before attempting the spin lock.
      
      One such example is below:
      
      For a custom usecase, I have intentionally failed the platform bus
      registration and I expected all the platform device/driver
      registrations to fail gracefully. But I came across this panic
      issue.
      
      [    1.331067] BUG: kernel NULL pointer dereference, address: 00000000000000c8
      [    1.331118] #PF: supervisor write access in kernel mode
      [    1.331163] #PF: error_code(0x0002) - not-present page
      [    1.331208] PGD 0 P4D 0
      [    1.331233] Oops: 0002 [#1] PREEMPT SMP
      [    1.331268] CPU: 3 PID: 1 Comm: swapper/0 Tainted: G        W         5.6.0-00049-g670d35fb0144 #165
      [    1.331341] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 0.0.0 02/06/2015
      [    1.331406] RIP: 0010:_raw_spin_lock+0x15/0x30
      [    1.331588] RSP: 0000:ffffc9000001be70 EFLAGS: 00010246
      [    1.331632] RAX: 0000000000000000 RBX: 00000000000000c8 RCX: 0000000000000001
      [    1.331696] RDX: 0000000000000001 RSI: 0000000000000092 RDI: 0000000000000000
      [    1.331754] RBP: 00000000ffffffed R08: 0000000000000501 R09: 0000000000000001
      [    1.331817] R10: ffff88817abcc520 R11: 0000000000000670 R12: 00000000ffffffed
      [    1.331881] R13: ffffffff82dbc268 R14: ffffffff832f070a R15: 0000000000000000
      [    1.331945] FS:  0000000000000000(0000) GS:ffff88817bd80000(0000) knlGS:0000000000000000
      [    1.332008] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      [    1.332062] CR2: 00000000000000c8 CR3: 000000000681e001 CR4: 00000000003606e0
      [    1.332126] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      [    1.332189] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
      [    1.332252] Call Trace:
      [    1.332281]  __platform_driver_probe+0x92/0xee
      [    1.332323]  ? rtc_dev_init+0x2b/0x2b
      [    1.332358]  cmos_init+0x37/0x67
      [    1.332396]  do_one_initcall+0x7d/0x168
      [    1.332428]  kernel_init_freeable+0x16c/0x1c9
      [    1.332473]  ? rest_init+0xc0/0xc0
      [    1.332508]  kernel_init+0x5/0x100
      [    1.332543]  ret_from_fork+0x1f/0x30
      [    1.332579] CR2: 00000000000000c8
      [    1.332616] ---[ end trace 3bd87f12e9010b87 ]---
      [    1.333549] note: swapper/0[1] exited with preempt_count 1
      [    1.333592] Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000009
      [    1.333736] Kernel Offset: disabled
      
      Note, this can only be triggered if a driver errors out from this call,
      which should never happen.  If it does, the driver needs to be fixed.
      Signed-off-by: NKuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
      Link: https://lore.kernel.org/r/20200408214003.3356-1-sathyanarayanan.kuppuswamy@linux.intel.comSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      388bcc6e
  9. 28 4月, 2020 1 次提交
  10. 23 4月, 2020 1 次提交
  11. 21 4月, 2020 1 次提交
  12. 01 4月, 2020 1 次提交
  13. 26 3月, 2020 1 次提交
  14. 24 3月, 2020 2 次提交
  15. 12 3月, 2020 1 次提交
    • C
      driver code: clarify and fix platform device DMA mask allocation · e3a36eb6
      Christoph Hellwig 提交于
      This does three inter-related things to clarify the usage of the
      platform device dma_mask field. In the process, fix the bug introduced
      by cdfee562 ("driver core: initialize a default DMA mask for
      platform device") that caused Artem Tashkinov's laptop to not boot with
      newer Fedora kernels.
      
      This does:
      
       - First off, rename the field to "platform_dma_mask" to make it
         greppable.
      
         We have way too many different random fields called "dma_mask" in
         various data structures, where some of them are actual masks, and
         some of them are just pointers to the mask. And the structures all
         have pointers to each other, or embed each other inside themselves,
         and "pdev" sometimes means "platform device" and sometimes it means
         "PCI device".
      
         So to make it clear in the code when you actually use this new field,
         give it a unique name (it really should be something even more unique
         like "platform_device_dma_mask", since it's per platform device, not
         per platform, but that gets old really fast, and this is unique
         enough in context).
      
         To further clarify when the field gets used, initialize it when we
         actually start using it with the default value.
      
       - Then, use this field instead of the random one-off allocation in
         platform_device_register_full() that is now unnecessary since we now
         already have a perfectly fine allocation for it in the platform
         device structure.
      
       - The above then allows us to fix the actual bug, where the error path
         of platform_device_register_full() would unconditionally free the
         platform device DMA allocation with 'kfree()'.
      
         That kfree() was dont regardless of whether the allocation had been
         done earlier with the (now removed) kmalloc, or whether
         setup_pdev_dma_masks() had already been used and the dma_mask pointer
         pointed to the mask that was part of the platform device.
      
      It seems most people never triggered the error path, or only triggered
      it from a call chain that set an explicit pdevinfo->dma_mask value (and
      thus caused the unnecessary allocation that was "cleaned up" in the
      error path) before calling platform_device_register_full().
      
      Robin Murphy points out that in Artem's case the wdat_wdt driver failed
      in platform_device_add(), and that was the one that had called
      platform_device_register_full() with pdevinfo.dma_mask = 0, and would
      have caused that kfree() of pdev.dma_mask corrupting the heap.
      
      A later unrelated kmalloc() then oopsed due to the heap corruption.
      
      Fixes: cdfee562 ("driver core: initialize a default DMA mask for platform device")
      Reported-bisected-and-tested-by: NArtem S. Tashkinov <aros@gmx.com>
      Reviewed-by: NRobin Murphy <robin.murphy@arm.com>
      Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NChristoph Hellwig <hch@lst.de>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      e3a36eb6
  16. 22 1月, 2020 1 次提交
  17. 14 1月, 2020 1 次提交
  18. 10 12月, 2019 1 次提交
  19. 14 11月, 2019 2 次提交
  20. 06 11月, 2019 2 次提交
  21. 11 10月, 2019 1 次提交
  22. 07 10月, 2019 2 次提交
  23. 29 8月, 2019 2 次提交
  24. 23 8月, 2019 1 次提交
  25. 30 7月, 2019 3 次提交
  26. 15 7月, 2019 1 次提交
  27. 21 6月, 2019 1 次提交
  28. 30 4月, 2019 1 次提交
  29. 26 4月, 2019 3 次提交