Thread (88 messages) 88 messages, 6 authors, 2025-10-29

Re: [PATCH v3 17/70] nstree: add listns()

From: Christian Brauner <brauner@kernel.org>
Date: 2025-10-28 13:33:09
Also in: bpf, cgroups, linux-fsdevel, lkml

On Tue, Oct 28, 2025 at 10:36:30AM +0000, Simon Horman wrote:
On Fri, Oct 24, 2025 at 12:52:46PM +0200, Christian Brauner wrote:

...
quoted
diff --git a/kernel/nstree.c b/kernel/nstree.c
...
quoted
+static ssize_t do_listns(struct klistns *kls)
+{
+	u64 *ns_ids = kls->kns_ids;
+	size_t nr_ns_ids = kls->nr_ns_ids;
+	struct ns_common *ns, *first_ns = NULL;
+	struct ns_tree *ns_tree = NULL;
+	const struct list_head *head;
+	struct user_namespace *user_ns;
+	u32 ns_type;
+	ssize_t ret;
+
+	if (hweight32(kls->ns_type) == 1)
+		ns_type = kls->ns_type;
+	else
+		ns_type = 0;
+
+	if (ns_type) {
+		ns_tree = ns_tree_from_type(ns_type);
+		if (!ns_tree)
+			return -EINVAL;
+	}
+
+	if (kls->last_ns_id) {
+		kls->first_ns = lookup_ns_id_at(kls->last_ns_id + 1, ns_type);
+		if (!kls->first_ns)
+			return -ENOENT;
+		first_ns = kls->first_ns;
+	}
+
+	ret = 0;
+	if (ns_tree)
+		head = &ns_tree->ns_list;
+	else
+		head = &ns_unified_list;
+
+	guard(rcu)();
+	if (!first_ns)
+		first_ns = first_ns_common(head, ns_tree);
+
+	for (ns = first_ns; !ns_common_is_head(ns, head, ns_tree) && nr_ns_ids;
+	     ns = next_ns_common(ns, ns_tree)) {
+		if (kls->ns_type && !(kls->ns_type & ns->ns_type))
+			continue;
+		if (!ns_get_unless_inactive(ns))
+			continue;
+		/* Check permissions */
+		if (!ns->ops)
+			user_ns = NULL;
Hi Christian,

Here it is assumed that ns->ops may be NULL.
quoted
+		else
+			user_ns = ns->ops->owner(ns);
+		if (!user_ns)
+			user_ns = &init_user_ns;
+		if (ns_capable_noaudit(user_ns, CAP_SYS_ADMIN) ||
+		    is_current_namespace(ns) ||
+		    ((ns->ns_type == CLONE_NEWUSER) && ns_capable_noaudit(to_user_ns(ns), CAP_SYS_ADMIN))) {
+			*ns_ids++ = ns->ns_id;
+			nr_ns_ids--;
+			ret++;
+		}
+		if (need_resched())
+			cond_resched_rcu();
+		/* doesn't sleep */
+		ns->ops->put(ns);
And, if so, it isn't clear to me why that wouldn't also be the case here.
Right you are. Fixed.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help