diff mbox series

[1/2] futex: adjust a futex timeout with a per-timens offset

Message ID 20201015072909.271426-1-avagin@gmail.com
State New
Headers show
Series [1/2] futex: adjust a futex timeout with a per-timens offset | expand

Commit Message

Andrei Vagin Oct. 15, 2020, 7:29 a.m. UTC
For all commands except FUTEX_WAIT, timeout is interpreted as an
absolute value. This absolute value is inside the task's time namespace
and has to be converted to the host's time.

Cc: <stable@vger.kernel.org>
Fixes: 5a590f35add9 ("posix-clocks: Wire up clock_gettime() with timens offsets")
Reported-by: Hans van der Laan <j.h.vanderlaan@student.utwente.nl>
Signed-off-by: Andrei Vagin <avagin@gmail.com>
---
 kernel/futex.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Dmitry Safonov Oct. 15, 2020, 1:26 p.m. UTC | #1
On 10/15/20 8:29 AM, Andrei Vagin wrote:
> For all commands except FUTEX_WAIT, timeout is interpreted as an

> absolute value. This absolute value is inside the task's time namespace

> and has to be converted to the host's time.

> 

> Cc: <stable@vger.kernel.org>

> Fixes: 5a590f35add9 ("posix-clocks: Wire up clock_gettime() with timens offsets")

> Reported-by: Hans van der Laan <j.h.vanderlaan@student.utwente.nl>

> Signed-off-by: Andrei Vagin <avagin@gmail.com>[..]

> @@ -3797,6 +3798,8 @@ SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val,

>  		t = timespec64_to_ktime(ts);

>  		if (cmd == FUTEX_WAIT)

>  			t = ktime_add_safe(ktime_get(), t);

> +		else if (!(cmd & FUTEX_CLOCK_REALTIME))

> +			t = timens_ktime_to_host(CLOCK_MONOTONIC, t);


Err, it probably should be
: else if (!(op & FUTEX_CLOCK_REALTIME))

And there's also
: SYSCALL_DEFINE6(futex_time32, ...)
which wants to be patched.

Thanks,
          Dmitry
Thomas Gleixner Oct. 15, 2020, 2:13 p.m. UTC | #2
On Thu, Oct 15 2020 at 14:26, Dmitry Safonov wrote:

> On 10/15/20 8:29 AM, Andrei Vagin wrote:

>> For all commands except FUTEX_WAIT, timeout is interpreted as an

>> absolute value. This absolute value is inside the task's time namespace

>> and has to be converted to the host's time.

>> 

>> Cc: <stable@vger.kernel.org>

>> Fixes: 5a590f35add9 ("posix-clocks: Wire up clock_gettime() with timens offsets")

>> Reported-by: Hans van der Laan <j.h.vanderlaan@student.utwente.nl>

>> Signed-off-by: Andrei Vagin <avagin@gmail.com>[..]

>> @@ -3797,6 +3798,8 @@ SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val,

>>  		t = timespec64_to_ktime(ts);

>>  		if (cmd == FUTEX_WAIT)

>>  			t = ktime_add_safe(ktime_get(), t);

>> +		else if (!(cmd & FUTEX_CLOCK_REALTIME))

>> +			t = timens_ktime_to_host(CLOCK_MONOTONIC, t);

>

> Err, it probably should be

> : else if (!(op & FUTEX_CLOCK_REALTIME))


Duh, you are right. I stared at it for a while and did not spot it.

> And there's also

> : SYSCALL_DEFINE6(futex_time32, ...)

> which wants to be patched.


Indeed. I zapped the commits.

Thanks,

        tglx
Andrei Vagin Oct. 16, 2020, 8:18 a.m. UTC | #3
On Thu, Oct 15, 2020 at 04:13:42PM +0200, Thomas Gleixner wrote:
> On Thu, Oct 15 2020 at 14:26, Dmitry Safonov wrote:

> 

> > On 10/15/20 8:29 AM, Andrei Vagin wrote:

> >> For all commands except FUTEX_WAIT, timeout is interpreted as an

> >> absolute value. This absolute value is inside the task's time namespace

> >> and has to be converted to the host's time.

> >> 

> >> Cc: <stable@vger.kernel.org>

> >> Fixes: 5a590f35add9 ("posix-clocks: Wire up clock_gettime() with timens offsets")

> >> Reported-by: Hans van der Laan <j.h.vanderlaan@student.utwente.nl>

> >> Signed-off-by: Andrei Vagin <avagin@gmail.com>[..]

> >> @@ -3797,6 +3798,8 @@ SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val,

> >>  		t = timespec64_to_ktime(ts);

> >>  		if (cmd == FUTEX_WAIT)

> >>  			t = ktime_add_safe(ktime_get(), t);

> >> +		else if (!(cmd & FUTEX_CLOCK_REALTIME))

> >> +			t = timens_ktime_to_host(CLOCK_MONOTONIC, t);

> >

> > Err, it probably should be

> > : else if (!(op & FUTEX_CLOCK_REALTIME))


Dmitry, thank you for catching this.

> 

> Duh, you are right. I stared at it for a while and did not spot it.

> 

> > And there's also

> > : SYSCALL_DEFINE6(futex_time32, ...)

> > which wants to be patched.

> 

> Indeed. I zapped the commits.


I sent a new version. This time, I extended the test to check
FUTEX_CLOCK_REALTIME and I compiled and run the compat version.
Everything works as it should be.

Thanks,
Andrei
diff mbox series

Patch

diff --git a/kernel/futex.c b/kernel/futex.c
index a5876694a60e..9ff2b8c5a506 100644
--- a/kernel/futex.c
+++ b/kernel/futex.c
@@ -39,6 +39,7 @@ 
 #include <linux/freezer.h>
 #include <linux/memblock.h>
 #include <linux/fault-inject.h>
+#include <linux/time_namespace.h>
 
 #include <asm/futex.h>
 
@@ -3797,6 +3798,8 @@  SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val,
 		t = timespec64_to_ktime(ts);
 		if (cmd == FUTEX_WAIT)
 			t = ktime_add_safe(ktime_get(), t);
+		else if (!(cmd & FUTEX_CLOCK_REALTIME))
+			t = timens_ktime_to_host(CLOCK_MONOTONIC, t);
 		tp = &t;
 	}
 	/*