hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/net/l2tp/l2tp_ppp.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*****************************************************************************
23 * Linux PPP over L2TP (PPPoX/PPPoL2TP) Sockets
34 *
....@@ -11,11 +12,6 @@
1112 * Based on original work by Martijn van Oosterhout <kleptog@svana.org>
1213 *
1314 * License:
14
- * This program is free software; you can redistribute it and/or
15
- * modify it under the terms of the GNU General Public License
16
- * as published by the Free Software Foundation; either version
17
- * 2 of the License, or (at your option) any later version.
18
- *
1915 */
2016
2117 /* This driver handles only L2TP data frames; control frames are handled by a
....@@ -121,8 +117,7 @@
121117 int owner; /* pid that opened the socket */
122118
123119 struct mutex sk_lock; /* Protects .sk */
124
- struct sock __rcu *sk; /* Pointer to the session
125
- * PPPoX socket */
120
+ struct sock __rcu *sk; /* Pointer to the session PPPoX socket */
126121 struct sock *__sk; /* Copy of .sk, for cleanup */
127122 struct rcu_head rcu; /* For asynchronous release */
128123 };
....@@ -159,17 +154,20 @@
159154 {
160155 struct l2tp_session *session;
161156
162
- if (sk == NULL)
157
+ if (!sk)
163158 return NULL;
164159
165160 sock_hold(sk);
166161 session = (struct l2tp_session *)(sk->sk_user_data);
167
- if (session == NULL) {
162
+ if (!session) {
168163 sock_put(sk);
169164 goto out;
170165 }
171
-
172
- BUG_ON(session->magic != L2TP_SESSION_MAGIC);
166
+ if (WARN_ON(session->magic != L2TP_SESSION_MAGIC)) {
167
+ session = NULL;
168
+ sock_put(sk);
169
+ goto out;
170
+ }
173171
174172 out:
175173 return session;
....@@ -222,7 +220,7 @@
222220 */
223221 rcu_read_lock();
224222 sk = rcu_dereference(ps->sk);
225
- if (sk == NULL)
223
+ if (!sk)
226224 goto no_sock;
227225
228226 /* If the first two bytes are 0xFF03, consider that it is the PPP's
....@@ -239,17 +237,9 @@
239237 if (sk->sk_state & PPPOX_BOUND) {
240238 struct pppox_sock *po;
241239
242
- l2tp_dbg(session, L2TP_MSG_DATA,
243
- "%s: recv %d byte data frame, passing to ppp\n",
244
- session->name, data_len);
245
-
246240 po = pppox_sk(sk);
247241 ppp_input(&po->chan, skb);
248242 } else {
249
- l2tp_dbg(session, L2TP_MSG_DATA,
250
- "%s: recv %d byte data frame, passing to L2TP socket\n",
251
- session->name, data_len);
252
-
253243 if (sock_queue_rcv_skb(sk, skb) < 0) {
254244 atomic_long_inc(&session->stats.rx_errors);
255245 kfree_skb(skb);
....@@ -261,7 +251,7 @@
261251
262252 no_sock:
263253 rcu_read_unlock();
264
- l2tp_info(session, L2TP_MSG_DATA, "%s: no socket\n", session->name);
254
+ pr_warn_ratelimited("%s: no socket in recv\n", session->name);
265255 kfree_skb(skb);
266256 }
267257
....@@ -290,7 +280,7 @@
290280 /* Get session and tunnel contexts */
291281 error = -EBADF;
292282 session = pppol2tp_sock_to_session(sk);
293
- if (session == NULL)
283
+ if (!session)
294284 goto error;
295285
296286 tunnel = session->tunnel;
....@@ -326,7 +316,7 @@
326316 }
327317
328318 local_bh_disable();
329
- l2tp_xmit_skb(session, skb, session->hdr_len);
319
+ l2tp_xmit_skb(session, skb);
330320 local_bh_enable();
331321
332322 sock_put(sk);
....@@ -355,7 +345,7 @@
355345 */
356346 static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb)
357347 {
358
- struct sock *sk = (struct sock *) chan->private;
348
+ struct sock *sk = (struct sock *)chan->private;
359349 struct l2tp_session *session;
360350 struct l2tp_tunnel *tunnel;
361351 int uhlen, headroom;
....@@ -365,7 +355,7 @@
365355
366356 /* Get session and tunnel contexts from the socket */
367357 session = pppol2tp_sock_to_session(sk);
368
- if (session == NULL)
358
+ if (!session)
369359 goto abort;
370360
371361 tunnel = session->tunnel;
....@@ -385,7 +375,7 @@
385375 skb->data[1] = PPP_UI;
386376
387377 local_bh_disable();
388
- l2tp_xmit_skb(session, skb, session->hdr_len);
378
+ l2tp_xmit_skb(session, skb);
389379 local_bh_enable();
390380
391381 sock_put(sk);
....@@ -424,7 +414,8 @@
424414
425415 if (session) {
426416 sk->sk_user_data = NULL;
427
- BUG_ON(session->magic != L2TP_SESSION_MAGIC);
417
+ if (WARN_ON(session->magic != L2TP_SESSION_MAGIC))
418
+ return;
428419 l2tp_session_dec_refcount(session);
429420 }
430421 }
....@@ -708,10 +699,9 @@
708699 * tunnel id.
709700 */
710701 if (!info.session_id && !info.peer_session_id) {
711
- if (tunnel == NULL) {
702
+ if (!tunnel) {
712703 struct l2tp_tunnel_cfg tcfg = {
713704 .encap = L2TP_ENCAPTYPE_UDP,
714
- .debug = 0,
715705 };
716706
717707 /* Prevent l2tp_tunnel_register() from trying to set up
....@@ -722,7 +712,7 @@
722712 goto end;
723713 }
724714
725
- error = l2tp_tunnel_create(sock_net(sk), info.fd,
715
+ error = l2tp_tunnel_create(info.fd,
726716 info.version,
727717 info.tunnel_id,
728718 info.peer_tunnel_id, &tcfg,
....@@ -743,11 +733,11 @@
743733 } else {
744734 /* Error if we can't find the tunnel */
745735 error = -ENOENT;
746
- if (tunnel == NULL)
736
+ if (!tunnel)
747737 goto end;
748738
749739 /* Error if socket is not prepped */
750
- if (tunnel->sock == NULL)
740
+ if (!tunnel->sock)
751741 goto end;
752742 }
753743
....@@ -807,8 +797,7 @@
807797 * the internal context for use by ioctl() and sockopt()
808798 * handlers.
809799 */
810
- if ((session->session_id == 0) &&
811
- (session->peer_session_id == 0)) {
800
+ if (session->session_id == 0 && session->peer_session_id == 0) {
812801 error = 0;
813802 goto out_no_ppp;
814803 }
....@@ -842,8 +831,6 @@
842831 drop_refcnt = false;
843832
844833 sk->sk_state = PPPOX_CONNECTED;
845
- l2tp_info(session, L2TP_MSG_CONTROL, "%s: created\n",
846
- session->name);
847834
848835 end:
849836 if (error) {
....@@ -916,22 +903,23 @@
916903 struct pppol2tp_session *pls;
917904
918905 error = -ENOTCONN;
919
- if (sk == NULL)
906
+ if (!sk)
920907 goto end;
921908 if (!(sk->sk_state & PPPOX_CONNECTED))
922909 goto end;
923910
924911 error = -EBADF;
925912 session = pppol2tp_sock_to_session(sk);
926
- if (session == NULL)
913
+ if (!session)
927914 goto end;
928915
929916 pls = l2tp_session_priv(session);
930917 tunnel = session->tunnel;
931918
932919 inet = inet_sk(tunnel->sock);
933
- if ((tunnel->version == 2) && (tunnel->sock->sk_family == AF_INET)) {
920
+ if (tunnel->version == 2 && tunnel->sock->sk_family == AF_INET) {
934921 struct sockaddr_pppol2tp sp;
922
+
935923 len = sizeof(sp);
936924 memset(&sp, 0, len);
937925 sp.sa_family = AF_PPPOX;
....@@ -947,8 +935,7 @@
947935 sp.pppol2tp.addr.sin_addr.s_addr = inet->inet_daddr;
948936 memcpy(uaddr, &sp, len);
949937 #if IS_ENABLED(CONFIG_IPV6)
950
- } else if ((tunnel->version == 2) &&
951
- (tunnel->sock->sk_family == AF_INET6)) {
938
+ } else if (tunnel->version == 2 && tunnel->sock->sk_family == AF_INET6) {
952939 struct sockaddr_pppol2tpin6 sp;
953940
954941 len = sizeof(sp);
....@@ -966,8 +953,7 @@
966953 memcpy(&sp.pppol2tp.addr.sin6_addr, &tunnel->sock->sk_v6_daddr,
967954 sizeof(tunnel->sock->sk_v6_daddr));
968955 memcpy(uaddr, &sp, len);
969
- } else if ((tunnel->version == 3) &&
970
- (tunnel->sock->sk_family == AF_INET6)) {
956
+ } else if (tunnel->version == 3 && tunnel->sock->sk_family == AF_INET6) {
971957 struct sockaddr_pppol2tpv3in6 sp;
972958
973959 len = sizeof(sp);
....@@ -988,6 +974,7 @@
988974 #endif
989975 } else if (tunnel->version == 3) {
990976 struct sockaddr_pppol2tpv3 sp;
977
+
991978 len = sizeof(sp);
992979 memset(&sp, 0, len);
993980 sp.sa_family = AF_PPPOX;
....@@ -1070,7 +1057,6 @@
10701057 {
10711058 struct pppol2tp_ioc_stats stats;
10721059 struct l2tp_session *session;
1073
- int val;
10741060
10751061 switch (cmd) {
10761062 case PPPIOCGMRU:
....@@ -1078,6 +1064,9 @@
10781064 session = sock->sk->sk_user_data;
10791065 if (!session)
10801066 return -ENOTCONN;
1067
+
1068
+ if (WARN_ON(session->magic != L2TP_SESSION_MAGIC))
1069
+ return -EBADF;
10811070
10821071 /* Not defined for tunnels */
10831072 if (!session->session_id && !session->peer_session_id)
....@@ -1093,11 +1082,14 @@
10931082 if (!session)
10941083 return -ENOTCONN;
10951084
1085
+ if (WARN_ON(session->magic != L2TP_SESSION_MAGIC))
1086
+ return -EBADF;
1087
+
10961088 /* Not defined for tunnels */
10971089 if (!session->session_id && !session->peer_session_id)
10981090 return -ENOSYS;
10991091
1100
- if (get_user(val, (int __user *)arg))
1092
+ if (!access_ok((int __user *)arg, sizeof(int)))
11011093 return -EFAULT;
11021094 break;
11031095
....@@ -1105,6 +1097,9 @@
11051097 session = sock->sk->sk_user_data;
11061098 if (!session)
11071099 return -ENOTCONN;
1100
+
1101
+ if (WARN_ON(session->magic != L2TP_SESSION_MAGIC))
1102
+ return -EBADF;
11081103
11091104 /* Session 0 represents the parent tunnel */
11101105 if (!session->session_id && !session->peer_session_id) {
....@@ -1160,9 +1155,7 @@
11601155
11611156 switch (optname) {
11621157 case PPPOL2TP_SO_DEBUG:
1163
- tunnel->debug = val;
1164
- l2tp_info(tunnel, L2TP_MSG_CONTROL, "%s: set debug=%x\n",
1165
- tunnel->name, tunnel->debug);
1158
+ /* Tunnel debug flags option is deprecated */
11661159 break;
11671160
11681161 default:
....@@ -1183,18 +1176,15 @@
11831176
11841177 switch (optname) {
11851178 case PPPOL2TP_SO_RECVSEQ:
1186
- if ((val != 0) && (val != 1)) {
1179
+ if (val != 0 && val != 1) {
11871180 err = -EINVAL;
11881181 break;
11891182 }
11901183 session->recv_seq = !!val;
1191
- l2tp_info(session, L2TP_MSG_CONTROL,
1192
- "%s: set recv_seq=%d\n",
1193
- session->name, session->recv_seq);
11941184 break;
11951185
11961186 case PPPOL2TP_SO_SENDSEQ:
1197
- if ((val != 0) && (val != 1)) {
1187
+ if (val != 0 && val != 1) {
11981188 err = -EINVAL;
11991189 break;
12001190 }
....@@ -1206,33 +1196,22 @@
12061196 PPPOL2TP_L2TP_HDR_SIZE_NOSEQ;
12071197 }
12081198 l2tp_session_set_header_len(session, session->tunnel->version);
1209
- l2tp_info(session, L2TP_MSG_CONTROL,
1210
- "%s: set send_seq=%d\n",
1211
- session->name, session->send_seq);
12121199 break;
12131200
12141201 case PPPOL2TP_SO_LNSMODE:
1215
- if ((val != 0) && (val != 1)) {
1202
+ if (val != 0 && val != 1) {
12161203 err = -EINVAL;
12171204 break;
12181205 }
12191206 session->lns_mode = !!val;
1220
- l2tp_info(session, L2TP_MSG_CONTROL,
1221
- "%s: set lns_mode=%d\n",
1222
- session->name, session->lns_mode);
12231207 break;
12241208
12251209 case PPPOL2TP_SO_DEBUG:
1226
- session->debug = val;
1227
- l2tp_info(session, L2TP_MSG_CONTROL, "%s: set debug=%x\n",
1228
- session->name, session->debug);
1210
+ /* Session debug flags option is deprecated */
12291211 break;
12301212
12311213 case PPPOL2TP_SO_REORDERTO:
12321214 session->reorder_timeout = msecs_to_jiffies(val);
1233
- l2tp_info(session, L2TP_MSG_CONTROL,
1234
- "%s: set reorder_timeout=%d\n",
1235
- session->name, session->reorder_timeout);
12361215 break;
12371216
12381217 default:
....@@ -1249,7 +1228,7 @@
12491228 * session or the special tunnel type.
12501229 */
12511230 static int pppol2tp_setsockopt(struct socket *sock, int level, int optname,
1252
- char __user *optval, unsigned int optlen)
1231
+ sockptr_t optval, unsigned int optlen)
12531232 {
12541233 struct sock *sk = sock->sk;
12551234 struct l2tp_session *session;
....@@ -1263,23 +1242,22 @@
12631242 if (optlen < sizeof(int))
12641243 return -EINVAL;
12651244
1266
- if (get_user(val, (int __user *)optval))
1245
+ if (copy_from_sockptr(&val, optval, sizeof(int)))
12671246 return -EFAULT;
12681247
12691248 err = -ENOTCONN;
1270
- if (sk->sk_user_data == NULL)
1249
+ if (!sk->sk_user_data)
12711250 goto end;
12721251
12731252 /* Get session context from the socket */
12741253 err = -EBADF;
12751254 session = pppol2tp_sock_to_session(sk);
1276
- if (session == NULL)
1255
+ if (!session)
12771256 goto end;
12781257
12791258 /* Special case: if session_id == 0x0000, treat as operation on tunnel
12801259 */
1281
- if ((session->session_id == 0) &&
1282
- (session->peer_session_id == 0)) {
1260
+ if (session->session_id == 0 && session->peer_session_id == 0) {
12831261 tunnel = session->tunnel;
12841262 err = pppol2tp_tunnel_setsockopt(sk, tunnel, optname, val);
12851263 } else {
....@@ -1301,9 +1279,8 @@
13011279
13021280 switch (optname) {
13031281 case PPPOL2TP_SO_DEBUG:
1304
- *val = tunnel->debug;
1305
- l2tp_info(tunnel, L2TP_MSG_CONTROL, "%s: get debug=%x\n",
1306
- tunnel->name, tunnel->debug);
1282
+ /* Tunnel debug flags option is deprecated */
1283
+ *val = 0;
13071284 break;
13081285
13091286 default:
....@@ -1325,32 +1302,23 @@
13251302 switch (optname) {
13261303 case PPPOL2TP_SO_RECVSEQ:
13271304 *val = session->recv_seq;
1328
- l2tp_info(session, L2TP_MSG_CONTROL,
1329
- "%s: get recv_seq=%d\n", session->name, *val);
13301305 break;
13311306
13321307 case PPPOL2TP_SO_SENDSEQ:
13331308 *val = session->send_seq;
1334
- l2tp_info(session, L2TP_MSG_CONTROL,
1335
- "%s: get send_seq=%d\n", session->name, *val);
13361309 break;
13371310
13381311 case PPPOL2TP_SO_LNSMODE:
13391312 *val = session->lns_mode;
1340
- l2tp_info(session, L2TP_MSG_CONTROL,
1341
- "%s: get lns_mode=%d\n", session->name, *val);
13421313 break;
13431314
13441315 case PPPOL2TP_SO_DEBUG:
1345
- *val = session->debug;
1346
- l2tp_info(session, L2TP_MSG_CONTROL, "%s: get debug=%d\n",
1347
- session->name, *val);
1316
+ /* Session debug flags option is deprecated */
1317
+ *val = 0;
13481318 break;
13491319
13501320 case PPPOL2TP_SO_REORDERTO:
1351
- *val = (int) jiffies_to_msecs(session->reorder_timeout);
1352
- l2tp_info(session, L2TP_MSG_CONTROL,
1353
- "%s: get reorder_timeout=%d\n", session->name, *val);
1321
+ *val = (int)jiffies_to_msecs(session->reorder_timeout);
13541322 break;
13551323
13561324 default:
....@@ -1386,18 +1354,17 @@
13861354 return -EINVAL;
13871355
13881356 err = -ENOTCONN;
1389
- if (sk->sk_user_data == NULL)
1357
+ if (!sk->sk_user_data)
13901358 goto end;
13911359
13921360 /* Get the session context */
13931361 err = -EBADF;
13941362 session = pppol2tp_sock_to_session(sk);
1395
- if (session == NULL)
1363
+ if (!session)
13961364 goto end;
13971365
13981366 /* Special case: if session_id == 0x0000, treat as operation on tunnel */
1399
- if ((session->session_id == 0) &&
1400
- (session->peer_session_id == 0)) {
1367
+ if (session->session_id == 0 && session->peer_session_id == 0) {
14011368 tunnel = session->tunnel;
14021369 err = pppol2tp_tunnel_getsockopt(sk, tunnel, optname, &val);
14031370 if (err)
....@@ -1412,7 +1379,7 @@
14121379 if (put_user(len, optlen))
14131380 goto end_put_sess;
14141381
1415
- if (copy_to_user((void __user *) optval, &val, len))
1382
+ if (copy_to_user((void __user *)optval, &val, len))
14161383 goto end_put_sess;
14171384
14181385 err = 0;
....@@ -1468,7 +1435,7 @@
14681435 pd->session = l2tp_session_get_nth(pd->tunnel, pd->session_idx);
14691436 pd->session_idx++;
14701437
1471
- if (pd->session == NULL) {
1438
+ if (!pd->session) {
14721439 pd->session_idx = 0;
14731440 pppol2tp_next_tunnel(net, pd);
14741441 }
....@@ -1483,17 +1450,21 @@
14831450 if (!pos)
14841451 goto out;
14851452
1486
- BUG_ON(m->private == NULL);
1453
+ if (WARN_ON(!m->private)) {
1454
+ pd = NULL;
1455
+ goto out;
1456
+ }
1457
+
14871458 pd = m->private;
14881459 net = seq_file_net(m);
14891460
1490
- if (pd->tunnel == NULL)
1461
+ if (!pd->tunnel)
14911462 pppol2tp_next_tunnel(net, pd);
14921463 else
14931464 pppol2tp_next_session(net, pd);
14941465
14951466 /* NULL tunnel and session indicates end of list */
1496
- if ((pd->tunnel == NULL) && (pd->session == NULL))
1467
+ if (!pd->tunnel && !pd->session)
14971468 pd = NULL;
14981469
14991470 out:
....@@ -1535,7 +1506,7 @@
15351506 (tunnel == tunnel->sock->sk_user_data) ? 'Y' : 'N',
15361507 refcount_read(&tunnel->ref_count) - 1);
15371508 seq_printf(m, " %08x %ld/%ld/%ld %ld/%ld/%ld\n",
1538
- tunnel->debug,
1509
+ 0,
15391510 atomic_long_read(&tunnel->stats.tx_packets),
15401511 atomic_long_read(&tunnel->stats.tx_bytes),
15411512 atomic_long_read(&tunnel->stats.tx_errors),
....@@ -1556,6 +1527,7 @@
15561527
15571528 if (tunnel->sock) {
15581529 struct inet_sock *inet = inet_sk(tunnel->sock);
1530
+
15591531 ip = ntohl(inet->inet_saddr);
15601532 port = ntohs(inet->inet_sport);
15611533 }
....@@ -1569,8 +1541,7 @@
15691541 user_data_ok = 'N';
15701542 }
15711543
1572
- seq_printf(m, " SESSION '%s' %08X/%d %04X/%04X -> "
1573
- "%04X/%04X %d %c\n",
1544
+ seq_printf(m, " SESSION '%s' %08X/%d %04X/%04X -> %04X/%04X %d %c\n",
15741545 session->name, ip, port,
15751546 tunnel->tunnel_id,
15761547 session->session_id,
....@@ -1581,7 +1552,7 @@
15811552 session->recv_seq ? 'R' : '-',
15821553 session->send_seq ? 'S' : '-',
15831554 session->lns_mode ? "LNS" : "LAC",
1584
- session->debug,
1555
+ 0,
15851556 jiffies_to_msecs(session->reorder_timeout));
15861557 seq_printf(m, " %hu/%hu %ld/%ld/%ld %ld/%ld/%ld\n",
15871558 session->nr, session->ns,
....@@ -1609,8 +1580,7 @@
16091580 seq_puts(m, "PPPoL2TP driver info, " PPPOL2TP_DRV_VERSION "\n");
16101581 seq_puts(m, "TUNNEL name, user-data-ok session-count\n");
16111582 seq_puts(m, " debug tx-pkts/bytes/errs rx-pkts/bytes/errs\n");
1612
- seq_puts(m, " SESSION name, addr/port src-tid/sid "
1613
- "dest-tid/sid state user-data-ok\n");
1583
+ seq_puts(m, " SESSION name, addr/port src-tid/sid dest-tid/sid state user-data-ok\n");
16141584 seq_puts(m, " mtu/mru/rcvseq/sendseq/lns debug reorderto\n");
16151585 seq_puts(m, " nr/ns tx-pkts/bytes/errs rx-pkts/bytes/errs\n");
16161586 goto out;
....@@ -1643,7 +1613,7 @@
16431613 int err = 0;
16441614
16451615 pde = proc_create_net("pppol2tp", 0444, net->proc_net,
1646
- &pppol2tp_seq_ops, sizeof(struct pppol2tp_seq_data));
1616
+ &pppol2tp_seq_ops, sizeof(struct pppol2tp_seq_data));
16471617 if (!pde) {
16481618 err = -ENOMEM;
16491619 goto out;