mirror_zfs/module/os/linux/zfs
Richard Yao 97143b9d31 Introduce kmem_scnprintf()
`snprintf()` is meant to protect against buffer overflows, but operating
on the buffer using its return value, possibly by calling it again, can
cause a buffer overflow, because it will return how many characters it
would have written if it had enough space even when it did not. In a
number of places, we repeatedly call snprintf() by successively
incrementing a buffer offset and decrementing a buffer length, by its
return value. This is a potentially unsafe usage of `snprintf()`
whenever the buffer length is reached. CodeQL complained about this.

To fix this, we introduce `kmem_scnprintf()`, which will return 0 when
the buffer is zero or the number of written characters, minus 1 to
exclude the NULL character, when the buffer was too small. In all other
cases, it behaves like snprintf(). The name is inspired by the Linux and
XNU kernels' `scnprintf()`. The implementation was written before I
thought to look at `scnprintf()` and had a good name for it, but it
turned out to have identical semantics to the Linux kernel version.
That lead to the name, `kmem_scnprintf()`.

CodeQL only catches this issue in loops, so repeated use of snprintf()
outside of a loop was not caught. As a result, a thorough audit of the
codebase was done to examine all instances of `snprintf()` usage for
potential problems and a few were caught. Fixes for them are included in
this patch.

Unfortunately, ZED is one of the places where `snprintf()` is
potentially used incorrectly. Since using `kmem_scnprintf()` in it would
require changing how it is linked, we modify its usage to make it safe,
no matter what buffer length is used. In addition, there was a bug in
the use of the return value where the NULL format character was not
being written by pwrite(). That has been fixed.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu>
Closes #14098
2022-10-29 13:05:11 -07:00
..
abd_os.c Aligned free for aligned alloc 2022-10-26 15:08:31 -07:00
arc_os.c Cleanup: 64-bit kernel module parameters should use fixed width types 2022-10-13 10:03:29 -07:00
mmp_os.c Cleanup: 64-bit kernel module parameters should use fixed width types 2022-10-13 10:03:29 -07:00
policy.c Support idmapped mount 2022-10-19 11:17:09 -07:00
qat_compress.c Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
qat_crypt.c Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
qat.c Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
spa_misc_os.c Cleanup: 64-bit kernel module parameters should use fixed width types 2022-10-13 10:03:29 -07:00
trace.c Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
vdev_disk.c Convert enum zio_flag to uint64_t 2022-10-27 09:54:54 -07:00
vdev_file.c Cleanup: 64-bit kernel module parameters should use fixed width types 2022-10-13 10:03:29 -07:00
zfs_acl.c Support idmapped mount 2022-10-19 11:17:09 -07:00
zfs_ctldir.c Remove zpl_revalidate: fix snapshot rollback 2022-10-28 09:47:19 -07:00
zfs_debug.c Fix declarations of non-global variables 2022-10-18 11:05:32 -07:00
zfs_dir.c zfs_rename: support RENAME_* flags 2022-10-28 09:49:20 -07:00
zfs_file_os.c Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
zfs_ioctl_os.c Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
zfs_racct.c module: zfs: fix unused, remove argsused 2021-12-23 09:42:47 -08:00
zfs_sysfs.c Introduce kmem_scnprintf() 2022-10-29 13:05:11 -07:00
zfs_uio.c Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
zfs_vfsops.c Remove zpl_revalidate: fix snapshot rollback 2022-10-28 09:47:19 -07:00
zfs_vnops_os.c zfs_rename: support RENAME_* flags 2022-10-28 09:49:20 -07:00
zfs_znode.c zfs_rename: support RENAME_* flags 2022-10-28 09:49:20 -07:00
zio_crypt.c Cleanup: Address Clang's static analyzer's unused code complaints 2022-10-14 13:37:54 -07:00
zpl_ctldir.c Support idmapped mount 2022-10-19 11:17:09 -07:00
zpl_export.c Replace dead opensolaris.org license link 2022-07-11 14:16:13 -07:00
zpl_file.c Support idmapped mount 2022-10-19 11:17:09 -07:00
zpl_inode.c zfs_rename: support RENAME_* flags 2022-10-28 09:49:20 -07:00
zpl_super.c Support idmapped mount 2022-10-19 11:17:09 -07:00
zpl_xattr.c Support idmapped mount 2022-10-19 11:17:09 -07:00
zvol_os.c Fix declarations of non-global variables 2022-10-18 11:05:32 -07:00