twx-linux/include/uapi/linux
Kees Cook 50d7bd38c3 stddef: Introduce struct_group() helper macro
Kernel code has a regular need to describe groups of members within a
structure usually when they need to be copied or initialized separately
from the rest of the surrounding structure. The generally accepted design
pattern in C is to use a named sub-struct:

	struct foo {
		int one;
		struct {
			int two;
			int three, four;
		} thing;
		int five;
	};

This would allow for traditional references and sizing:

	memcpy(&dst.thing, &src.thing, sizeof(dst.thing));

However, doing this would mean that referencing struct members enclosed
by such named structs would always require including the sub-struct name
in identifiers:

	do_something(dst.thing.three);

This has tended to be quite inflexible, especially when such groupings
need to be added to established code which causes huge naming churn.
Three workarounds exist in the kernel for this problem, and each have
other negative properties.

To avoid the naming churn, there is a design pattern of adding macro
aliases for the named struct:

	#define f_three thing.three

This ends up polluting the global namespace, and makes it difficult to
search for identifiers.

Another common work-around in kernel code avoids the pollution by avoiding
the named struct entirely, instead identifying the group's boundaries using
either a pair of empty anonymous structs of a pair of zero-element arrays:

	struct foo {
		int one;
		struct { } start;
		int two;
		int three, four;
		struct { } finish;
		int five;
	};

	struct foo {
		int one;
		int start[0];
		int two;
		int three, four;
		int finish[0];
		int five;
	};

This allows code to avoid needing to use a sub-struct named for member
references within the surrounding structure, but loses the benefits of
being able to actually use such a struct, making it rather fragile. Using
these requires open-coded calculation of sizes and offsets. The efforts
made to avoid common mistakes include lots of comments, or adding various
BUILD_BUG_ON()s. Such code is left with no way for the compiler to reason
about the boundaries (e.g. the "start" object looks like it's 0 bytes
in length), making bounds checking depend on open-coded calculations:

	if (length > offsetof(struct foo, finish) -
		     offsetof(struct foo, start))
		return -EINVAL;
	memcpy(&dst.start, &src.start, offsetof(struct foo, finish) -
				       offsetof(struct foo, start));

However, the vast majority of places in the kernel that operate on
groups of members do so without any identification of the grouping,
relying either on comments or implicit knowledge of the struct contents,
which is even harder for the compiler to reason about, and results in
even more fragile manual sizing, usually depending on member locations
outside of the region (e.g. to copy "two" and "three", use the start of
"four" to find the size):

	BUILD_BUG_ON((offsetof(struct foo, four) <
		      offsetof(struct foo, two)) ||
		     (offsetof(struct foo, four) <
		      offsetof(struct foo, three));
	if (length > offsetof(struct foo, four) -
		     offsetof(struct foo, two))
		return -EINVAL;
	memcpy(&dst.two, &src.two, length);

In order to have a regular programmatic way to describe a struct
region that can be used for references and sizing, can be examined for
bounds checking, avoids forcing the use of intermediate identifiers,
and avoids polluting the global namespace, introduce the struct_group()
macro. This macro wraps the member declarations to create an anonymous
union of an anonymous struct (no intermediate name) and a named struct
(for references and sizing):

	struct foo {
		int one;
		struct_group(thing,
			int two;
			int three, four;
		);
		int five;
	};

	if (length > sizeof(src.thing))
		return -EINVAL;
	memcpy(&dst.thing, &src.thing, length);
	do_something(dst.three);

There are some rare cases where the resulting struct_group() needs
attributes added, so struct_group_attr() is also introduced to allow
for specifying struct attributes (e.g. __align(x) or __packed).
Additionally, there are places where such declarations would like to
have the struct be tagged, so struct_group_tagged() is added.

Given there is a need for a handful of UAPI uses too, the underlying
__struct_group() macro has been defined in UAPI so it can be used there
too.

To avoid confusing scripts/kernel-doc, hide the macro from its struct
parsing.

Co-developed-by: Keith Packard <keithp@keithp.com>
Signed-off-by: Keith Packard <keithp@keithp.com>
Acked-by: Gustavo A. R. Silva <gustavoars@kernel.org>
Link: https://lore.kernel.org/lkml/20210728023217.GC35706@embeddedor
Enhanced-by: Rasmus Villemoes <linux@rasmusvillemoes.dk>
Link: https://lore.kernel.org/lkml/41183a98-bdb9-4ad6-7eab-5a7292a6df84@rasmusvillemoes.dk
Enhanced-by: Dan Williams <dan.j.williams@intel.com>
Link: https://lore.kernel.org/lkml/1d9a2e6df2a9a35b2cdd50a9a68cac5991e7e5f0.camel@intel.com
Enhanced-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: https://lore.kernel.org/lkml/YQKa76A6XuFqgM03@phenom.ffwll.local
Acked-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Kees Cook <keescook@chromium.org>
2021-09-25 08:20:47 -07:00
..
android
byteorder
caif
can can: j1939: extend UAPI to notify about RX status 2021-08-04 12:11:52 +02:00
cifs
dvb Revert "media: dvb header files: move some headers to staging" 2021-08-23 09:49:09 -07:00
genwqe
hdlc
hsi
iio
isdn
misc
mmc
netfilter Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf 2021-09-03 16:20:37 -07:00
netfilter_arp
netfilter_bridge
netfilter_ipv4
netfilter_ipv6
nfsd NFSD: remove vanity comments 2021-08-17 11:47:53 -04:00
raid
sched
spi
sunrpc
surface_aggregator platform/surface: aggregator_cdev: Allow enabling of events from user-space 2021-06-16 17:47:53 +02:00
tc_act net/sched: act_skbmod: Add SKBMOD_F_ECN option support 2021-07-28 13:19:31 +01:00
tc_ematch
usb
a.out.h
acct.h
acrn.h
adb.h
adfs_fs.h
affs_hardblocks.h
agpgart.h
aio_abi.h
am437x-vpfe.h
apm_bios.h
arcfb.h
arm_sdei.h
aspeed-lpc-ctrl.h
aspeed-p2a-ctrl.h
atalk.h
atm_eni.h
atm_he.h
atm_idt77105.h
atm_nicstar.h
atm_tcp.h
atm_zatm.h
atm.h
atmapi.h
atmarp.h
atmbr2684.h
atmclip.h
atmdev.h
atmioc.h
atmlec.h
atmmpc.h
atmppp.h
atmsap.h
atmsvc.h
audit.h audit: remove trailing spaces and tabs 2021-06-10 20:59:05 -04:00
auto_dev-ioctl.h
auto_fs4.h
auto_fs.h
auxvec.h uapi/auxvec: Define the aux vector AT_MINSIGSTKSZ 2021-05-19 11:40:15 +02:00
ax25.h
batadv_packet.h
batman_adv.h
baycom.h
bcache.h
bcm933xx_hcs.h
bfs_fs.h
binfmts.h
blkpg.h
blktrace_api.h
blkzoned.h
bpf_common.h
bpf_perf_event.h
bpf.h bpf: Add bpf_task_pt_regs() helper 2021-08-25 10:37:05 -07:00
bpfilter.h
bpqether.h
bsg.h
bt-bmc.h
btf.h
btrfs_tree.h btrfs: initial fsverity support 2021-08-23 13:19:09 +02:00
btrfs.h btrfs: initial fsverity support 2021-08-23 13:19:09 +02:00
can.h can: uapi: introduce CANFD_FDF flag for mixed content in struct canfd_frame 2021-05-27 09:42:21 +02:00
capability.h exit/bdflush: Remove the deprecated bdflush system call 2021-07-12 15:17:47 -05:00
capi.h
cciss_defs.h
cciss_ioctl.h
ccs.h
cdrom.h
cec-funcs.h media: uapi/linux/cec-funcs.h: set delay to 1 if unnused 2021-06-02 14:08:09 +02:00
cec.h media: include/uapi/linux/cec.h: typo: SATERDAY -> SATURDAY 2021-07-12 09:16:29 +02:00
cfm_bridge.h
cgroupstats.h
chio.h
close_range.h
cm4000_cs.h
cn_proc.h
coda.h
coff.h
connector.h
const.h
coresight-stm.h
cramfs_fs.h
cryptouser.h
cuda.h
cxl_mem.h cxl/uapi: Fix defined but not used warnings 2021-09-07 11:39:01 -07:00
cycx_cfm.h
dcbnl.h
dccp.h
devlink.h devlink: Allow setting parent node of rate objects 2021-06-02 14:08:37 -07:00
dlm_device.h
dlm_netlink.h
dlm_plock.h
dlm.h
dlmconstants.h
dm-ioctl.h dm ima: measure data on table load 2021-08-10 13:32:40 -04:00
dm-log-userspace.h
dma-buf.h dma-buf: Document DMA_BUF_IOCTL_SYNC (v3) 2021-06-17 21:46:37 +02:00
dma-heap.h
dn.h
dns_resolver.h
dqblk_xfs.h
edd.h
efs_fs_sb.h
elf-em.h
elf-fdpic.h
elf.h
errno.h
errqueue.h
erspan.h
ethtool_netlink.h ethtool: add two coalesce attributes for CQE mode 2021-08-24 07:38:28 -07:00
ethtool.h ethtool: add two link extended substates of bad signal integrity 2021-08-16 15:12:13 -07:00
eventpoll.h
f2fs.h
fadvise.h
falloc.h
fanotify.h fanotify: add pidfd support to the fanotify API 2021-08-10 13:08:49 +02:00
fb.h
fcntl.h
fd.h
fdreg.h
fib_rules.h
fiemap.h
filter.h
firewire-cdev.h
firewire-constants.h
fou.h
fpga-dfl.h
fs.h block: add ioctl to read the disk sequence number 2021-08-02 13:37:28 -06:00
fscrypt.h
fsi.h
fsl_hypervisor.h
fsl_mc.h
fsmap.h
fsverity.h
fuse.h virtiofs: propagate sync() to file server 2021-06-22 09:15:35 +02:00
futex.h futex: Provide FUTEX_LOCK_PI2 to support clock selection 2021-06-22 16:42:09 +02:00
gameport.h
gen_stats.h
genetlink.h
gfs2_ondisk.h
gpio.h
gsmmux.h
gtp.h
hash_info.h
hdlc.h
hdlcdrv.h
hdreg.h
hid.h
hiddev.h
hidraw.h
hpet.h
hsr_netlink.h
hw_breakpoint.h
hyperv.h
i2c-dev.h
i2c.h
i2o-dev.h
i8k.h
icmp.h icmp: fix lib conflict with trinity 2021-06-03 15:31:34 -07:00
icmpv6.h
idxd.h dmaengine: idxd: fix setting up priv mode for dwq 2021-08-29 19:14:20 +05:30
if_addr.h
if_addrlabel.h
if_alg.h
if_arcnet.h
if_arp.h mctp: Add initial driver infrastructure 2021-07-29 15:06:50 +01:00
if_bonding.h treewide: remove editor modelines and cruft 2021-05-07 00:26:34 -07:00
if_bridge.h net: bridge: vlan: convert mcast router global option to per-vlan entry 2021-08-20 15:00:35 +01:00
if_cablemodem.h
if_eql.h
if_ether.h mctp: Add device handling and netlink interface 2021-07-29 15:06:50 +01:00
if_fc.h
if_fddi.h
if_hippi.h
if_infiniband.h
if_link.h ipv6: add IFLA_INET6_RA_MTU to expose mtu value 2021-08-27 17:29:18 -07:00
if_ltalk.h
if_macsec.h
if_packet.h
if_phonet.h
if_plip.h
if_ppp.h
if_pppol2tp.h
if_pppox.h
if_slip.h
if_team.h
if_tun.h
if_tunnel.h
if_vlan.h
if_x25.h
if_xdp.h
if.h
ife.h
igmp.h
ila.h
in6.h ipv6: ioam: Data plane support for Pre-allocated Trace 2021-07-21 08:14:33 -07:00
in_route.h
in.h net/ipv4/ipv6: Replace one-element arraya with flexible-array members 2021-08-05 11:46:42 +01:00
inet_diag.h
inotify.h
input-event-codes.h
input.h
io_uring.h io-wq: provide IO_WQ_* constants for IORING_REGISTER_IOWQ_MAX_WORKERS arg items 2021-09-13 10:38:13 -06:00
ioam6_genl.h ipv6: ioam: IOAM Generic Netlink API 2021-07-21 08:14:33 -07:00
ioam6_iptunnel.h ipv6: ioam: Support for IOAM injection with lwtunnels 2021-07-21 08:14:33 -07:00
ioam6.h ipv6: ioam: Support for IOAM injection with lwtunnels 2021-07-21 08:14:33 -07:00
ioctl.h
iommu.h
ioprio.h block: fix default IO priority handling 2021-08-18 07:23:15 -06:00
ip6_tunnel.h
ip_vs.h
ip.h
ipc.h
ipmi_bmc.h
ipmi_msgdefs.h
ipmi.h
ipsec.h
ipv6_route.h
ipv6.h ipv6: ioam: Data plane support for Pre-allocated Trace 2021-07-21 08:14:33 -07:00
irqnr.h
iso_fs.h
isst_if.h
ivtv.h
ivtvfb.h
jffs2.h
joystick.h
kcm.h
kcmp.h
kcov.h
kd.h
kdev_t.h
kernel-page-flags.h
kernel.h
kernelcapi.h
kexec.h
keyboard.h
keyctl.h
kfd_ioctl.h drm/amdkfd: Allow querying SVM attributes that are clear 2021-08-06 16:12:32 -04:00
kvm_para.h KVM: X86: Introduce KVM_HC_MAP_GPA_RANGE hypercall 2021-06-17 14:25:39 -04:00
kvm.h KVM: stats: Support linear and logarithmic histogram statistics 2021-08-20 16:06:32 -04:00
l2tp.h
landlock.h
libc-compat.h
limits.h
lirc.h media: lirc: remove out of date comment 2021-05-21 15:03:50 +02:00
llc.h
loop.h
lp.h
lwtunnel.h ipv6: ioam: Support for IOAM injection with lwtunnels 2021-07-21 08:14:33 -07:00
magic.h mm: introduce memfd_secret system call to create "secret" memory areas 2021-07-08 11:48:21 -07:00
major.h
map_to_7segment.h
matroxfb.h
max2175.h
mctp.h mctp: Allow per-netns default networks 2021-07-29 15:06:50 +01:00
mdio.h
media-bus-format.h
media.h
mei.h
membarrier.h
memfd.h
mempolicy.h mm/mempolicy: add MPOL_PREFERRED_MANY for multiple preferred nodes 2021-09-03 09:58:17 -07:00
meye.h
mii.h
minix_fs.h
mman.h
mmtimer.h
module.h
mount.h move_mount: allow to add a mount into an existing group 2021-07-26 14:45:18 +02:00
mpls_iptunnel.h
mpls.h
mptcp.h mptcp: remote addresses fullmesh 2021-08-18 10:10:01 +01:00
mqueue.h
mroute6.h
mroute.h
mrp_bridge.h
msdos_fs.h
msg.h
mtio.h
nbd-netlink.h nbd: provide a way for userspace processes to identify device backends 2021-06-30 15:34:04 -06:00
nbd.h
ncsi.h
ndctl.h
neighbour.h net: bridge: fix flags interpretation for extern learn fdb entries 2021-08-10 11:29:39 -07:00
net_dropmon.h
net_namespace.h
net_tstamp.h net: sock: extend SO_TIMESTAMPING for PHC binding 2021-07-01 13:08:18 -07:00
net.h Revert "net: add pf_family_names[] for protocol family" 2021-06-18 13:02:45 -07:00
netconf.h
netdevice.h
netfilter_arp.h
netfilter_bridge.h
netfilter_decnet.h
netfilter_ipv4.h
netfilter_ipv6.h
netfilter.h
netlink_diag.h
netlink.h netlink: simplify NLMSG_DATA with NLMSG_HDRLEN 2021-06-10 12:51:33 -07:00
netrom.h
nexthop.h
nfc.h
nfs2.h
nfs3.h
nfs4_mount.h
nfs4.h treewide: remove editor modelines and cruft 2021-05-07 00:26:34 -07:00
nfs_fs.h
nfs_idmap.h
nfs_mount.h
nfs.h
nfsacl.h
nilfs2_api.h
nilfs2_ondisk.h
nitro_enclaves.h
nl80211-vnd-intel.h nl80211: vendor-cmd: add Intel vendor commands for iwlmei usage 2021-08-13 09:50:24 +02:00
nl80211.h nl80211: add support for BSS coloring 2021-08-17 11:58:21 +02:00
nsfs.h
nubus.h
nvme_ioctl.h
nvram.h
omap3isp.h
omapfb.h
oom.h
openat2.h
openvswitch.h openvswitch: fix alignment issues 2021-07-27 11:48:42 +01:00
packet_diag.h
param.h
parport.h
patchkey.h
pci_regs.h
pci.h
pcitest.h PCI: Fix kernel-doc formatting 2021-07-06 10:37:46 -05:00
perf_event.h Merge branch 'for-v5.13-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace 2021-05-21 06:12:52 -10:00
personality.h
pfkeyv2.h
pg.h
phantom.h
phonet.h
pidfd.h
pkt_cls.h net_sched: refactor TC action init API 2021-08-02 10:24:38 +01:00
pkt_sched.h fq_codel: reject silly quantum parameters 2021-09-04 10:49:46 +01:00
pktcdvd.h
pmu.h
poll.h
posix_acl_xattr.h
posix_acl.h
posix_types.h
ppdev.h
ppp_defs.h
ppp-comp.h
ppp-ioctl.h
pps.h
pr.h
prctl.h arm64 updates for 5.15: 2021-09-01 15:04:29 -07:00
psample.h
psci.h
psp-sev.h
ptp_clock.h
ptrace.h
qemu_fw_cfg.h
qnx4_fs.h
qnxtypes.h
qrtr.h
quota.h
radeonfb.h
random.h
rds.h
reboot.h
reiserfs_fs.h
reiserfs_xattr.h
remoteproc_cdev.h
resource.h
rfkill.h
rio_cm_cdev.h
rio_mport_cdev.h
rkisp1-config.h
romfs_fs.h
rose.h
route.h
rpl_iptunnel.h
rpl.h
rpmsg_types.h
rpmsg.h
rseq.h
rtc.h
rtnetlink.h
rxrpc.h
scc.h
sched.h
scif_ioctl.h
screen_info.h
sctp.h sctp: add SCTP_PLPMTUD_PROBE_INTERVAL sockopt for sock/asoc/transport 2021-06-22 11:28:51 -07:00
seccomp.h seccomp: Support atomic "addfd + send reply" 2021-06-28 12:49:52 -07:00
securebits.h
sed-opal.h
seg6_genl.h
seg6_hmac.h
seg6_iptunnel.h
seg6_local.h seg6: add support for SRv6 End.DT46 Behavior 2021-06-18 11:35:47 -07:00
seg6.h
selinux_netlink.h
sem.h
serial_core.h
serial_reg.h serial: 8250: Define RX trigger levels for OxSemi 950 devices 2021-07-27 12:05:46 +02:00
serial.h
serio.h
shm.h
signal.h
signalfd.h signalfd: Remove SIL_PERF_EVENT fields from signalfd_siginfo 2021-05-18 16:20:54 -05:00
smc_diag.h
smc.h net/smc: Add netlink support for SMC fallback statistics 2021-06-16 12:54:02 -07:00
smiapp.h
snmp.h tcp: Add stats for socket migration. 2021-06-23 12:56:08 -07:00
sock_diag.h
socket.h sock: allow reading and changing sk_userlocks with setsockopt 2021-08-04 12:52:03 +01:00
sockios.h
sonet.h
sonypi.h
sound.h
soundcard.h
stat.h
stddef.h stddef: Introduce struct_group() helper macro 2021-09-25 08:20:47 -07:00
stm.h
string.h
suspend_ioctls.h
swab.h
switchtec_ioctl.h
sync_file.h
synclink.h
sysctl.h
sysinfo.h
target_core_user.h scsi: target: tcmu: Add new feature KEEP_BUF 2021-08-03 07:27:42 -04:00
taskstats.h
tcp_metrics.h
tcp.h
tee.h
termios.h
thermal.h
time_types.h
time.h
timerfd.h
times.h
timex.h
tiocl.h
tipc_config.h
tipc_netlink.h
tipc_sockets_diag.h
tipc.h
tls.h
toshiba.h
tty_flags.h
tty.h
types.h
udf_fs_i.h
udmabuf.h
udp.h
uhid.h
uinput.h
uio.h
uleds.h
ultrasound.h
um_timetravel.h
un.h
unistd.h
unix_diag.h
usbdevice_fs.h
usbip.h
userfaultfd.h userfaultfd/shmem: advertise shmem minor fault support 2021-06-30 20:47:27 -07:00
userio.h
utime.h
utsname.h
uuid.h
uvcvideo.h
v4l2-common.h
v4l2-controls.h media: v4l2-ctrls: Add intra-refresh period control 2021-08-04 14:43:52 +02:00
v4l2-dv-timings.h
v4l2-mediabus.h
v4l2-subdev.h
vbox_err.h
vbox_vmmdev_types.h
vboxguest.h
vdpa.h
vduse.h vduse: Introduce VDUSE - vDPA Device in Userspace 2021-09-06 07:20:58 -04:00
veth.h
vfio_ccw.h
vfio_zdev.h
vfio.h
vhost_types.h
vhost.h
videodev2.h media: uapi: move MPEG-2 stateless controls out of staging 2021-05-23 19:21:31 +02:00
virtio_9p.h
virtio_balloon.h
virtio_blk.h
virtio_bt.h
virtio_config.h
virtio_console.h
virtio_crypto.h
virtio_fs.h
virtio_gpio.h gpio: virtio: Fix sparse warnings 2021-08-31 11:07:05 +02:00
virtio_gpu.h
virtio_i2c.h i2c: virtio: add a virtio i2c frontend driver 2021-08-19 21:21:19 +02:00
virtio_ids.h virtio,vdpa,vhost: features, fixes 2021-09-11 14:48:42 -07:00
virtio_input.h
virtio_iommu.h
virtio_mem.h
virtio_mmio.h
virtio_net.h
virtio_pci.h
virtio_pcidev.h um: virt-pci: fix uapi documentation 2021-08-26 22:28:03 +02:00
virtio_pmem.h
virtio_ring.h
virtio_rng.h
virtio_scmi.h firmware: arm_scmi: Add virtio transport 2021-08-05 10:24:08 +01:00
virtio_scsi.h
virtio_snd.h
virtio_types.h
virtio_vsock.h virtio/vsock: add 'VIRTIO_VSOCK_SEQ_EOR' bit. 2021-09-05 16:23:09 -04:00
vm_sockets_diag.h
vm_sockets.h
vmcore.h
vsockmon.h
vt.h
vtpm_proxy.h
wait.h
watch_queue.h
watchdog.h
wireguard.h
wireless.h
wmi.h
wwan.h wwan: add interface creation support 2021-06-12 13:16:45 -07:00
x25.h
xattr.h
xdp_diag.h
xfrm.h net: xfrm: fix shift-out-of-bounce 2021-07-29 08:04:10 +02:00
xilinx-v4l2-controls.h
zorro_ids.h
zorro.h