netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/3] bpf: Don't check for current being NULL
@ 2017-10-16 18:18 Richard Weinberger
  2017-10-16 18:18 ` [PATCH 2/3] bpf: Remove dead variable Richard Weinberger
  2017-10-16 18:18 ` [PATCH 3/3] bpf: Make sure that ->comm does not change under us Richard Weinberger
  0 siblings, 2 replies; 14+ messages in thread
From: Richard Weinberger @ 2017-10-16 18:18 UTC (permalink / raw)
  To: netdev; +Cc: linux-kernel, daniel, ast, Richard Weinberger

current is never NULL.

Signed-off-by: Richard Weinberger <richard@nod.at>
---
 kernel/bpf/helpers.c | 12 ------------
 1 file changed, 12 deletions(-)

diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c
index 3d24e238221e..e8845adcd15e 100644
--- a/kernel/bpf/helpers.c
+++ b/kernel/bpf/helpers.c
@@ -120,9 +120,6 @@ BPF_CALL_0(bpf_get_current_pid_tgid)
 {
 	struct task_struct *task = current;
 
-	if (unlikely(!task))
-		return -EINVAL;
-
 	return (u64) task->tgid << 32 | task->pid;
 }
 
@@ -138,9 +135,6 @@ BPF_CALL_0(bpf_get_current_uid_gid)
 	kuid_t uid;
 	kgid_t gid;
 
-	if (unlikely(!task))
-		return -EINVAL;
-
 	current_uid_gid(&uid, &gid);
 	return (u64) from_kgid(&init_user_ns, gid) << 32 |
 		     from_kuid(&init_user_ns, uid);
@@ -156,9 +150,6 @@ BPF_CALL_2(bpf_get_current_comm, char *, buf, u32, size)
 {
 	struct task_struct *task = current;
 
-	if (unlikely(!task))
-		goto err_clear;
-
 	strncpy(buf, task->comm, size);
 
 	/* Verifier guarantees that size > 0. For task->comm exceeding
@@ -167,9 +158,6 @@ BPF_CALL_2(bpf_get_current_comm, char *, buf, u32, size)
 	 */
 	buf[size - 1] = 0;
 	return 0;
-err_clear:
-	memset(buf, 0, size);
-	return -EINVAL;
 }
 
 const struct bpf_func_proto bpf_get_current_comm_proto = {
-- 
2.13.6

^ permalink raw reply related	[flat|nested] 14+ messages in thread
* Re: [PATCH 3/3] bpf: Make sure that ->comm does not change under us.
@ 2017-10-16 22:10 Alexei Starovoitov
  2017-10-16 22:19 ` Daniel Borkmann
  0 siblings, 1 reply; 14+ messages in thread
From: Alexei Starovoitov @ 2017-10-16 22:10 UTC (permalink / raw)
  To: Richard Weinberger
  Cc: Daniel Borkmann, netdev@vger.kernel.org,
	linux-kernel@vger.kernel.org, Alexei Starovoitov

On Mon, Oct 16, 2017 at 2:10 PM, Richard Weinberger <richard@nod.at> wrote:
> Am Montag, 16. Oktober 2017, 23:02:06 CEST schrieb Daniel Borkmann:
>> On 10/16/2017 10:55 PM, Richard Weinberger wrote:
>> > Am Montag, 16. Oktober 2017, 22:50:43 CEST schrieb Daniel Borkmann:
>> >>>           struct task_struct *task = current;
>> >>>
>> >>> + task_lock(task);
>> >>>
>> >>>           strncpy(buf, task->comm, size);
>> >>>
>> >>> + task_unlock(task);
>> >>
>> >> Wouldn't this potentially lead to a deadlock? E.g. you attach yourself
>> >> to task_lock() / spin_lock() / etc, and then the BPF prog triggers the
>> >> bpf_get_current_comm() taking the lock again ...
>> >
>> > Yes, but doesn't the same apply to the use case when I attach to strncpy()
>> > and run bpf_get_current_comm()?
>>
>> You mean due to recursion? In that case trace_call_bpf() would bail out
>> due to the bpf_prog_active counter.
>
> Ah, that's true.
> So, when someone wants to use bpf_get_current_comm() while tracing task_lock,
> we have a problem. I agree.
> On the other hand, without locking the function may return wrong results.

it will surely race with somebody else setting task comm and it's fine.
all of bpf tracing is read-only, so locks are only allowed inside bpf core
bits like maps. Taking core locks like task_lock() is quite scary.
bpf scripts rely on bpf_probe_read() of all sorts of kernel fields
so reading comm here w/o lock is fine.

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2017-10-16 22:19 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-10-16 18:18 [PATCH 1/3] bpf: Don't check for current being NULL Richard Weinberger
2017-10-16 18:18 ` [PATCH 2/3] bpf: Remove dead variable Richard Weinberger
2017-10-16 18:54   ` Daniel Borkmann
2017-10-16 18:59     ` Richard Weinberger
2017-10-16 19:11       ` Daniel Borkmann
2017-10-16 19:22         ` Richard Weinberger
2017-10-16 20:48           ` Daniel Borkmann
2017-10-16 18:18 ` [PATCH 3/3] bpf: Make sure that ->comm does not change under us Richard Weinberger
2017-10-16 20:50   ` Daniel Borkmann
2017-10-16 20:55     ` Richard Weinberger
2017-10-16 21:02       ` Daniel Borkmann
2017-10-16 21:10         ` Richard Weinberger
  -- strict thread matches above, loose matches on Subject: below --
2017-10-16 22:10 Alexei Starovoitov
2017-10-16 22:19 ` Daniel Borkmann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).