Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'SO_MAX_PACING_RATE-64-bit'

Eric Dumazet says:

====================
net: 64bit support for SO_MAX_PACING_RATE

64bit kernels adopted 64bit type for sk_max_pacing_rate in linux-4.20

We can change how we implement SO_MAX_PACING_RATE socket option
to support 64bit values to/from user space as well.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+21 -7
+21 -7
net/core/sock.c
··· 1108 1108 #endif 1109 1109 1110 1110 case SO_MAX_PACING_RATE: 1111 - if (val != ~0U) 1111 + { 1112 + unsigned long ulval = (val == ~0U) ? ~0UL : val; 1113 + 1114 + if (sizeof(ulval) != sizeof(val) && 1115 + optlen >= sizeof(ulval) && 1116 + get_user(ulval, (unsigned long __user *)optval)) { 1117 + ret = -EFAULT; 1118 + break; 1119 + } 1120 + if (ulval != ~0UL) 1112 1121 cmpxchg(&sk->sk_pacing_status, 1113 1122 SK_PACING_NONE, 1114 1123 SK_PACING_NEEDED); 1115 - sk->sk_max_pacing_rate = (val == ~0U) ? ~0UL : val; 1116 - sk->sk_pacing_rate = min(sk->sk_pacing_rate, 1117 - sk->sk_max_pacing_rate); 1124 + sk->sk_max_pacing_rate = ulval; 1125 + sk->sk_pacing_rate = min(sk->sk_pacing_rate, ulval); 1118 1126 break; 1119 - 1127 + } 1120 1128 case SO_INCOMING_CPU: 1121 1129 sk->sk_incoming_cpu = val; 1122 1130 break; ··· 1219 1211 union { 1220 1212 int val; 1221 1213 u64 val64; 1214 + unsigned long ulval; 1222 1215 struct linger ling; 1223 1216 struct old_timeval32 tm32; 1224 1217 struct __kernel_old_timeval tm; ··· 1465 1456 #endif 1466 1457 1467 1458 case SO_MAX_PACING_RATE: 1468 - /* 32bit version */ 1469 - v.val = min_t(unsigned long, sk->sk_max_pacing_rate, ~0U); 1459 + if (sizeof(v.ulval) != sizeof(v.val) && len >= sizeof(v.ulval)) { 1460 + lv = sizeof(v.ulval); 1461 + v.ulval = sk->sk_max_pacing_rate; 1462 + } else { 1463 + /* 32bit version */ 1464 + v.val = min_t(unsigned long, sk->sk_max_pacing_rate, ~0U); 1465 + } 1470 1466 break; 1471 1467 1472 1468 case SO_INCOMING_CPU: