History

socket: fix compat SO_RCVTIMEO_NEW/SO_SNDTIMEO_NEW

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.

Arnd Bergmann committed 7 years ago

Commit e6986421 parent 50ce1631 file · +2 −2Browse files

Showing the changes to net/core (1 of 1 file). Show all

Unified · Split

net/core/sock.c+2−2
@@ -348,7 +348,7 @@ static int sock_get_timeout(long timeo, void *optval, bool old_timeval) · 347 unmodified lines
348 tv.tv_usec = ((timeo % HZ) * USEC_PER_SEC) / HZ;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 struct old_timeval32 tv32 = { tv.tv_sec, tv.tv_usec };352 struct old_timeval32 tv32 = { tv.tv_sec, tv.tv_usec };
353 *(struct old_timeval32 *)optval = tv32;353 *(struct old_timeval32 *)optval = tv32;
354 return sizeof(tv32);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 struct __kernel_sock_timeval tv;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 struct old_timeval32 tv32;376 struct old_timeval32 tv32;
377 377
378 if (optlen < sizeof(tv32))378 if (optlen < sizeof(tv32))