Re: [PATCH bpf 4/9] bpf: Acquire map uref in .init_seq_private for sock{map,hash} iterator

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 8/6/22 12:40 AM, Hou Tao wrote:
From: Hou Tao <houtao1@xxxxxxxxxx>

During bpf(BPF_LINK_CREATE), sock_map_iter_attach_target() has already
acquired a map uref, but the uref may be released by bpf_link_release()
during th reading of map iterator.

Fixing it by acquiring an extra map uref in .init_seq_private and
releasing it in .fini_seq_private.

Fixes: 0365351524d7 ("net: Allow iterating sockmap and sockhash")
Signed-off-by: Hou Tao <houtao1@xxxxxxxxxx>

See my previous reply for some wording issue.

Acked-by: Yonghong Song <yhs@xxxxxx>

---
  net/core/sock_map.c | 20 +++++++++++++++++++-
  1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/net/core/sock_map.c b/net/core/sock_map.c
index 028813dfecb0..9a9fb9487d63 100644
--- a/net/core/sock_map.c
+++ b/net/core/sock_map.c
@@ -783,13 +783,22 @@ static int sock_map_init_seq_private(void *priv_data,
  {
  	struct sock_map_seq_info *info = priv_data;
+ bpf_map_inc_with_uref(aux->map);
  	info->map = aux->map;
  	return 0;
  }
+static void sock_map_fini_seq_private(void *priv_data)
+{
+	struct sock_map_seq_info *info = priv_data;
+
+	bpf_map_put_with_uref(info->map);
+}
+
  static const struct bpf_iter_seq_info sock_map_iter_seq_info = {
  	.seq_ops		= &sock_map_seq_ops,
  	.init_seq_private	= sock_map_init_seq_private,
+	.fini_seq_private	= sock_map_fini_seq_private,
  	.seq_priv_size		= sizeof(struct sock_map_seq_info),
  };
@@ -1369,18 +1378,27 @@ static const struct seq_operations sock_hash_seq_ops = {
  };
static int sock_hash_init_seq_private(void *priv_data,
-				     struct bpf_iter_aux_info *aux)
+				      struct bpf_iter_aux_info *aux)
  {
  	struct sock_hash_seq_info *info = priv_data;
+ bpf_map_inc_with_uref(aux->map);
  	info->map = aux->map;
  	info->htab = container_of(aux->map, struct bpf_shtab, map);
  	return 0;
  }
+static void sock_hash_fini_seq_private(void *priv_data)
+{
+	struct sock_hash_seq_info *info = priv_data;
+
+	bpf_map_put_with_uref(info->map);
+}
+
  static const struct bpf_iter_seq_info sock_hash_iter_seq_info = {
  	.seq_ops		= &sock_hash_seq_ops,
  	.init_seq_private	= sock_hash_init_seq_private,
+	.fini_seq_private	= sock_hash_fini_seq_private,
  	.seq_priv_size		= sizeof(struct sock_hash_seq_info),
  };



[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux