mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-28 04:03:23 -04:00
Right now if some LSM such as Smack denies an AF_UNIX socket peer to receive an SCM_RIGHTS fd, the SCM_RIGHTS fd array will be cut short at that point, and MSG_CTRUNC is set on return of recvmsg(). This is highly problematic behaviour, because it leaves the receiver wondering what happened. As per man page MSG_CTRUNC is supposed to indicate that the control buffer was sized too short, but suddenly a permission error might result in the exact same flag being set. Moreover, the receiver has no chance to determine how many fds got originally sent and how many were suppressed.[1] Add a SO_RIGHTS_NOTRUNC option to UNIX sockets to enable more useful handling of LSM denials when receiving SCM_RIGHTS messages: instead of truncating the message at the first blocked fd, keep every fd slot and store the LSM errno in the blocked slot. The socket option is inherited by the child accept() socket if set on the listen() socket. [1]: https://github.com/uapi-group/kernel-features#useful-handling-of-lsm-denials-on-scm_rights Reviewed-by: Christian Brauner (Amutable) <brauner@kernel.org> Signed-off-by: Jori Koolstra <jkoolstra@xs4all.nl> Link: https://patch.msgid.link/20260813162818.149248-4-jkoolstra@xs4all.nl Signed-off-by: Jakub Kicinski <kuba@kernel.org>
181 lines
4.0 KiB
C
181 lines
4.0 KiB
C
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
|
#ifndef __ASM_GENERIC_SOCKET_H
|
|
#define __ASM_GENERIC_SOCKET_H
|
|
|
|
#include <linux/posix_types.h>
|
|
#include <asm/sockios.h>
|
|
|
|
/* For setsockopt(2) */
|
|
#define SOL_SOCKET 1
|
|
|
|
#define SO_DEBUG 1
|
|
#define SO_REUSEADDR 2
|
|
#define SO_TYPE 3
|
|
#define SO_ERROR 4
|
|
#define SO_DONTROUTE 5
|
|
#define SO_BROADCAST 6
|
|
#define SO_SNDBUF 7
|
|
#define SO_RCVBUF 8
|
|
#define SO_SNDBUFFORCE 32
|
|
#define SO_RCVBUFFORCE 33
|
|
#define SO_KEEPALIVE 9
|
|
#define SO_OOBINLINE 10
|
|
#define SO_NO_CHECK 11
|
|
#define SO_PRIORITY 12
|
|
#define SO_LINGER 13
|
|
#define SO_BSDCOMPAT 14
|
|
#define SO_REUSEPORT 15
|
|
#ifndef SO_PASSCRED /* powerpc only differs in these */
|
|
#define SO_PASSCRED 16
|
|
#define SO_PEERCRED 17
|
|
#define SO_RCVLOWAT 18
|
|
#define SO_SNDLOWAT 19
|
|
#define SO_RCVTIMEO_OLD 20
|
|
#define SO_SNDTIMEO_OLD 21
|
|
#endif
|
|
|
|
/* Security levels - as per NRL IPv6 - don't actually do anything */
|
|
#define SO_SECURITY_AUTHENTICATION 22
|
|
#define SO_SECURITY_ENCRYPTION_TRANSPORT 23
|
|
#define SO_SECURITY_ENCRYPTION_NETWORK 24
|
|
|
|
#define SO_BINDTODEVICE 25
|
|
|
|
/* Socket filtering */
|
|
#define SO_ATTACH_FILTER 26
|
|
#define SO_DETACH_FILTER 27
|
|
#define SO_GET_FILTER SO_ATTACH_FILTER
|
|
|
|
#define SO_PEERNAME 28
|
|
|
|
#define SO_ACCEPTCONN 30
|
|
|
|
#define SO_PEERSEC 31
|
|
#define SO_PASSSEC 34
|
|
|
|
#define SO_MARK 36
|
|
|
|
#define SO_PROTOCOL 38
|
|
#define SO_DOMAIN 39
|
|
|
|
#define SO_RXQ_OVFL 40
|
|
|
|
#define SO_WIFI_STATUS 41
|
|
#define SCM_WIFI_STATUS SO_WIFI_STATUS
|
|
#define SO_PEEK_OFF 42
|
|
|
|
/* Instruct lower device to use last 4-bytes of skb data as FCS */
|
|
#define SO_NOFCS 43
|
|
|
|
#define SO_LOCK_FILTER 44
|
|
|
|
#define SO_SELECT_ERR_QUEUE 45
|
|
|
|
#define SO_BUSY_POLL 46
|
|
|
|
#define SO_MAX_PACING_RATE 47
|
|
|
|
#define SO_BPF_EXTENSIONS 48
|
|
|
|
#define SO_INCOMING_CPU 49
|
|
|
|
#define SO_ATTACH_BPF 50
|
|
#define SO_DETACH_BPF SO_DETACH_FILTER
|
|
|
|
#define SO_ATTACH_REUSEPORT_CBPF 51
|
|
#define SO_ATTACH_REUSEPORT_EBPF 52
|
|
|
|
#define SO_CNX_ADVICE 53
|
|
|
|
#define SCM_TIMESTAMPING_OPT_STATS 54
|
|
|
|
#define SO_MEMINFO 55
|
|
|
|
#define SO_INCOMING_NAPI_ID 56
|
|
|
|
#define SO_COOKIE 57
|
|
|
|
#define SCM_TIMESTAMPING_PKTINFO 58
|
|
|
|
#define SO_PEERGROUPS 59
|
|
|
|
#define SO_ZEROCOPY 60
|
|
|
|
#define SO_TXTIME 61
|
|
#define SCM_TXTIME SO_TXTIME
|
|
|
|
#define SO_BINDTOIFINDEX 62
|
|
|
|
#define SO_TIMESTAMP_OLD 29
|
|
#define SO_TIMESTAMPNS_OLD 35
|
|
#define SO_TIMESTAMPING_OLD 37
|
|
|
|
#define SO_TIMESTAMP_NEW 63
|
|
#define SO_TIMESTAMPNS_NEW 64
|
|
#define SO_TIMESTAMPING_NEW 65
|
|
|
|
#define SO_RCVTIMEO_NEW 66
|
|
#define SO_SNDTIMEO_NEW 67
|
|
|
|
#define SO_DETACH_REUSEPORT_BPF 68
|
|
|
|
#define SO_PREFER_BUSY_POLL 69
|
|
#define SO_BUSY_POLL_BUDGET 70
|
|
|
|
#define SO_NETNS_COOKIE 71
|
|
|
|
#define SO_BUF_LOCK 72
|
|
|
|
#define SO_RESERVE_MEM 73
|
|
|
|
#define SO_TXREHASH 74
|
|
|
|
#define SO_RCVMARK 75
|
|
|
|
#define SO_PASSPIDFD 76
|
|
#define SO_PEERPIDFD 77
|
|
|
|
#define SO_DEVMEM_LINEAR 78
|
|
#define SCM_DEVMEM_LINEAR SO_DEVMEM_LINEAR
|
|
#define SO_DEVMEM_DMABUF 79
|
|
#define SCM_DEVMEM_DMABUF SO_DEVMEM_DMABUF
|
|
#define SO_DEVMEM_DONTNEED 80
|
|
|
|
#define SCM_TS_OPT_ID 81
|
|
|
|
#define SO_RCVPRIORITY 82
|
|
|
|
#define SO_PASSRIGHTS 83
|
|
|
|
#define SO_INQ 84
|
|
#define SCM_INQ SO_INQ
|
|
|
|
#define SO_RIGHTS_NOTRUNC 85
|
|
|
|
#if !defined(__KERNEL__)
|
|
|
|
#if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__))
|
|
/* on 64-bit and x32, avoid the ?: operator */
|
|
#define SO_TIMESTAMP SO_TIMESTAMP_OLD
|
|
#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD
|
|
#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD
|
|
|
|
#define SO_RCVTIMEO SO_RCVTIMEO_OLD
|
|
#define SO_SNDTIMEO SO_SNDTIMEO_OLD
|
|
#else
|
|
#define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW)
|
|
#define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW)
|
|
#define SO_TIMESTAMPING (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPING_OLD : SO_TIMESTAMPING_NEW)
|
|
|
|
#define SO_RCVTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_RCVTIMEO_OLD : SO_RCVTIMEO_NEW)
|
|
#define SO_SNDTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_SNDTIMEO_OLD : SO_SNDTIMEO_NEW)
|
|
#endif
|
|
|
|
#define SCM_TIMESTAMP SO_TIMESTAMP
|
|
#define SCM_TIMESTAMPNS SO_TIMESTAMPNS
|
|
#define SCM_TIMESTAMPING SO_TIMESTAMPING
|
|
|
|
#endif
|
|
|
|
#endif /* __ASM_GENERIC_SOCKET_H */
|