It looks like the new socket options only work correctly for native execution, but in case of compat mode fall back to the old behavior as we ignore the 'old_timeval' flag. Rework so we treat SO_RCVTIMEO_NEW/SO_SNDTIMEO_NEW the same way in compat and native 32-bit mode.
Showing the changes to net/core (1 of 1 file). Show all
Unified · Split
| @@ -348,7 +348,7 @@ static int sock_get_timeout(long timeo, void *optval, bool old_timeval) · 347 unmodified lines | ||
| 348 | 348 | tv.tv_usec = ((timeo % HZ) * USEC_PER_SEC) / HZ; |
| 349 | 349 | } |
| 350 | 350 | |
| 351 | − if (in_compat_syscall() && !COMPAT_USE_64BIT_TIME) { | |
| 351 | + if (old_timeval && in_compat_syscall() && !COMPAT_USE_64BIT_TIME) { | |
| 352 | 352 | struct old_timeval32 tv32 = { tv.tv_sec, tv.tv_usec }; |
| 353 | 353 | *(struct old_timeval32 *)optval = tv32; |
| 354 | 354 | return sizeof(tv32); |
| @@ -372,7 +372,7 @@ static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen, bool · 17 unmodified lines | ||
| 372 | 372 | { |
| 373 | 373 | struct __kernel_sock_timeval tv; |
| 374 | 374 | |
| 375 | − if (in_compat_syscall() && !COMPAT_USE_64BIT_TIME) { | |
| 375 | + if (old_timeval && in_compat_syscall() && !COMPAT_USE_64BIT_TIME) { | |
| 376 | 376 | struct old_timeval32 tv32; |
| 377 | 377 | |
| 378 | 378 | if (optlen < sizeof(tv32)) |