Commit 6bf21b54 authored by Magnus Karlsson's avatar Magnus Karlsson Committed by Daniel Borkmann

libbpf: fix to reject unknown flags in xsk_socket__create()

In xsk_socket__create(), the libbpf_flags field was not checked for
setting currently unused/unknown flags. This patch fixes that by
returning -EINVAL if the user has set any flag that is not in use at
this point in time.

Fixes: 1cad0788 ("libbpf: add support for using AF_XDP sockets")
Signed-off-by: default avatarMagnus Karlsson <magnus.karlsson@intel.com>
Reviewed-by: default avatarAndrii Nakryiko <andriin@fb.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parent d6f18371
...@@ -126,7 +126,7 @@ static void xsk_set_umem_config(struct xsk_umem_config *cfg, ...@@ -126,7 +126,7 @@ static void xsk_set_umem_config(struct xsk_umem_config *cfg,
cfg->frame_headroom = usr_cfg->frame_headroom; cfg->frame_headroom = usr_cfg->frame_headroom;
} }
static void xsk_set_xdp_socket_config(struct xsk_socket_config *cfg, static int xsk_set_xdp_socket_config(struct xsk_socket_config *cfg,
const struct xsk_socket_config *usr_cfg) const struct xsk_socket_config *usr_cfg)
{ {
if (!usr_cfg) { if (!usr_cfg) {
...@@ -135,14 +135,19 @@ static void xsk_set_xdp_socket_config(struct xsk_socket_config *cfg, ...@@ -135,14 +135,19 @@ static void xsk_set_xdp_socket_config(struct xsk_socket_config *cfg,
cfg->libbpf_flags = 0; cfg->libbpf_flags = 0;
cfg->xdp_flags = 0; cfg->xdp_flags = 0;
cfg->bind_flags = 0; cfg->bind_flags = 0;
return; return 0;
} }
if (usr_cfg->libbpf_flags & ~XSK_LIBBPF_FLAGS__INHIBIT_PROG_LOAD)
return -EINVAL;
cfg->rx_size = usr_cfg->rx_size; cfg->rx_size = usr_cfg->rx_size;
cfg->tx_size = usr_cfg->tx_size; cfg->tx_size = usr_cfg->tx_size;
cfg->libbpf_flags = usr_cfg->libbpf_flags; cfg->libbpf_flags = usr_cfg->libbpf_flags;
cfg->xdp_flags = usr_cfg->xdp_flags; cfg->xdp_flags = usr_cfg->xdp_flags;
cfg->bind_flags = usr_cfg->bind_flags; cfg->bind_flags = usr_cfg->bind_flags;
return 0;
} }
int xsk_umem__create(struct xsk_umem **umem_ptr, void *umem_area, __u64 size, int xsk_umem__create(struct xsk_umem **umem_ptr, void *umem_area, __u64 size,
...@@ -557,7 +562,9 @@ int xsk_socket__create(struct xsk_socket **xsk_ptr, const char *ifname, ...@@ -557,7 +562,9 @@ int xsk_socket__create(struct xsk_socket **xsk_ptr, const char *ifname,
} }
strncpy(xsk->ifname, ifname, IFNAMSIZ); strncpy(xsk->ifname, ifname, IFNAMSIZ);
xsk_set_xdp_socket_config(&xsk->config, usr_config); err = xsk_set_xdp_socket_config(&xsk->config, usr_config);
if (err)
goto out_socket;
if (rx) { if (rx) {
err = setsockopt(xsk->fd, SOL_XDP, XDP_RX_RING, err = setsockopt(xsk->fd, SOL_XDP, XDP_RX_RING,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment