summaryrefslogtreecommitdiffstats
path: root/Documentation/bpf
diff options
context:
space:
mode:
authorStanislav Fomichev <sdf@google.com>2020-06-17 03:04:16 +0200
committerAlexei Starovoitov <ast@kernel.org>2020-06-17 19:54:05 +0200
commit8030e250d882db174cbcd88273570ffb36a13080 (patch)
treedc7cd3c1ae17b73b2a7e56cef6eaac706ae3c080 /Documentation/bpf
parentselftests/bpf: Make sure optvals > PAGE_SIZE are bypassed (diff)
downloadlinux-8030e250d882db174cbcd88273570ffb36a13080.tar.xz
linux-8030e250d882db174cbcd88273570ffb36a13080.zip
bpf: Document optval > PAGE_SIZE behavior for sockopt hooks
Extend existing doc with more details about requiring ctx->optlen = 0 for handling optval > PAGE_SIZE. Signed-off-by: Stanislav Fomichev <sdf@google.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Link: https://lore.kernel.org/bpf/20200617010416.93086-3-sdf@google.com
Diffstat (limited to 'Documentation/bpf')
-rw-r--r--Documentation/bpf/prog_cgroup_sockopt.rst14
1 files changed, 14 insertions, 0 deletions
diff --git a/Documentation/bpf/prog_cgroup_sockopt.rst b/Documentation/bpf/prog_cgroup_sockopt.rst
index c47d974629ae..172f957204bf 100644
--- a/Documentation/bpf/prog_cgroup_sockopt.rst
+++ b/Documentation/bpf/prog_cgroup_sockopt.rst
@@ -86,6 +86,20 @@ then the next program in the chain (A) will see those changes,
*not* the original input ``setsockopt`` arguments. The potentially
modified values will be then passed down to the kernel.
+Large optval
+============
+When the ``optval`` is greater than the ``PAGE_SIZE``, the BPF program
+can access only the first ``PAGE_SIZE`` of that data. So it has to options:
+
+* Set ``optlen`` to zero, which indicates that the kernel should
+ use the original buffer from the userspace. Any modifications
+ done by the BPF program to the ``optval`` are ignored.
+* Set ``optlen`` to the value less than ``PAGE_SIZE``, which
+ indicates that the kernel should use BPF's trimmed ``optval``.
+
+When the BPF program returns with the ``optlen`` greater than
+``PAGE_SIZE``, the userspace will receive ``EFAULT`` errno.
+
Example
=======