diff options
Diffstat (limited to 'net/ipv4/udp.c')
-rw-r--r-- | net/ipv4/udp.c | 51 |
1 files changed, 43 insertions, 8 deletions
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 00840474a449..0b0721bd45c6 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -1207,16 +1207,13 @@ static int udp_destroy_sock(struct sock *sk) | |||
1207 | /* | 1207 | /* |
1208 | * Socket option code for UDP | 1208 | * Socket option code for UDP |
1209 | */ | 1209 | */ |
1210 | static int udp_setsockopt(struct sock *sk, int level, int optname, | 1210 | static int do_udp_setsockopt(struct sock *sk, int level, int optname, |
1211 | char __user *optval, int optlen) | 1211 | char __user *optval, int optlen) |
1212 | { | 1212 | { |
1213 | struct udp_sock *up = udp_sk(sk); | 1213 | struct udp_sock *up = udp_sk(sk); |
1214 | int val; | 1214 | int val; |
1215 | int err = 0; | 1215 | int err = 0; |
1216 | 1216 | ||
1217 | if (level != SOL_UDP) | ||
1218 | return ip_setsockopt(sk, level, optname, optval, optlen); | ||
1219 | |||
1220 | if(optlen<sizeof(int)) | 1217 | if(optlen<sizeof(int)) |
1221 | return -EINVAL; | 1218 | return -EINVAL; |
1222 | 1219 | ||
@@ -1256,15 +1253,31 @@ static int udp_setsockopt(struct sock *sk, int level, int optname, | |||
1256 | return err; | 1253 | return err; |
1257 | } | 1254 | } |
1258 | 1255 | ||
1259 | static int udp_getsockopt(struct sock *sk, int level, int optname, | 1256 | static int udp_setsockopt(struct sock *sk, int level, int optname, |
1257 | char __user *optval, int optlen) | ||
1258 | { | ||
1259 | if (level != SOL_UDP) | ||
1260 | return ip_setsockopt(sk, level, optname, optval, optlen); | ||
1261 | return do_udp_setsockopt(sk, level, optname, optval, optlen); | ||
1262 | } | ||
1263 | |||
1264 | #ifdef CONFIG_COMPAT | ||
1265 | static int compat_udp_setsockopt(struct sock *sk, int level, int optname, | ||
1266 | char __user *optval, int optlen) | ||
1267 | { | ||
1268 | if (level != SOL_UDP) | ||
1269 | return compat_ip_setsockopt(sk, level, | ||
1270 | optname, optval, optlen); | ||
1271 | return do_udp_setsockopt(sk, level, optname, optval, optlen); | ||
1272 | } | ||
1273 | #endif | ||
1274 | |||
1275 | static int do_udp_getsockopt(struct sock *sk, int level, int optname, | ||
1260 | char __user *optval, int __user *optlen) | 1276 | char __user *optval, int __user *optlen) |
1261 | { | 1277 | { |
1262 | struct udp_sock *up = udp_sk(sk); | 1278 | struct udp_sock *up = udp_sk(sk); |
1263 | int val, len; | 1279 | int val, len; |
1264 | 1280 | ||
1265 | if (level != SOL_UDP) | ||
1266 | return ip_getsockopt(sk, level, optname, optval, optlen); | ||
1267 | |||
1268 | if(get_user(len,optlen)) | 1281 | if(get_user(len,optlen)) |
1269 | return -EFAULT; | 1282 | return -EFAULT; |
1270 | 1283 | ||
@@ -1293,6 +1306,24 @@ static int udp_getsockopt(struct sock *sk, int level, int optname, | |||
1293 | return 0; | 1306 | return 0; |
1294 | } | 1307 | } |
1295 | 1308 | ||
1309 | static int udp_getsockopt(struct sock *sk, int level, int optname, | ||
1310 | char __user *optval, int __user *optlen) | ||
1311 | { | ||
1312 | if (level != SOL_UDP) | ||
1313 | return ip_getsockopt(sk, level, optname, optval, optlen); | ||
1314 | return do_udp_getsockopt(sk, level, optname, optval, optlen); | ||
1315 | } | ||
1316 | |||
1317 | #ifdef CONFIG_COMPAT | ||
1318 | static int compat_udp_getsockopt(struct sock *sk, int level, int optname, | ||
1319 | char __user *optval, int __user *optlen) | ||
1320 | { | ||
1321 | if (level != SOL_UDP) | ||
1322 | return compat_ip_getsockopt(sk, level, | ||
1323 | optname, optval, optlen); | ||
1324 | return do_udp_getsockopt(sk, level, optname, optval, optlen); | ||
1325 | } | ||
1326 | #endif | ||
1296 | /** | 1327 | /** |
1297 | * udp_poll - wait for a UDP event. | 1328 | * udp_poll - wait for a UDP event. |
1298 | * @file - file struct | 1329 | * @file - file struct |
@@ -1350,6 +1381,10 @@ struct proto udp_prot = { | |||
1350 | .destroy = udp_destroy_sock, | 1381 | .destroy = udp_destroy_sock, |
1351 | .setsockopt = udp_setsockopt, | 1382 | .setsockopt = udp_setsockopt, |
1352 | .getsockopt = udp_getsockopt, | 1383 | .getsockopt = udp_getsockopt, |
1384 | #ifdef CONFIG_COMPAT | ||
1385 | .compat_setsockopt = compat_udp_setsockopt, | ||
1386 | .compat_getsockopt = compat_udp_getsockopt, | ||
1387 | #endif | ||
1353 | .sendmsg = udp_sendmsg, | 1388 | .sendmsg = udp_sendmsg, |
1354 | .recvmsg = udp_recvmsg, | 1389 | .recvmsg = udp_recvmsg, |
1355 | .sendpage = udp_sendpage, | 1390 | .sendpage = udp_sendpage, |