ports/net/mpd5/files/patch-l2tp-ctrl-c.diff
Eugene Grosbein fe1375b13d
net/mpd5: add L2TP fix from upstream (r2410, r2411).
This change should fix the problem reported in bugs #38 #47 #74.
It is L2TP interoperability issue with some Juniper, Cisco and
YAMAHA RTX routers having strict protocol checks.

Move USES to pet portlint.

Reported by: Kikuchan at SourceForge (based on)
2021-08-18 19:50:26 +07:00

71 lines
2.4 KiB
Diff

Index: src/l2tp_ctrl.c
===================================================================
--- src/l2tp_ctrl.c (revision 2409)
+++ src/l2tp_ctrl.c (revision 2411)
@@ -244,7 +244,8 @@ Notes
************************************************************************/
static int ppp_l2tp_ctrl_setup_1(struct ppp_l2tp_ctrl *ctrl,
- struct ppp_l2tp_avp_ptrs *ptrs);
+ struct ppp_l2tp_avp_ptrs *ptrs,
+ struct ppp_l2tp_avp_list *avps);
static int ppp_l2tp_ctrl_setup_2(struct ppp_l2tp_ctrl *ctrl,
struct ppp_l2tp_avp_ptrs *ptrs);
static void ppp_l2tp_ctrl_send(struct ppp_l2tp_ctrl *ctrl,
@@ -1031,7 +1032,8 @@ ppp_l2tp_sess_hooked(struct ppp_l2tp_sess *sess) {
*/
static int
ppp_l2tp_ctrl_setup_1(struct ppp_l2tp_ctrl *ctrl,
- struct ppp_l2tp_avp_ptrs *ptrs)
+ struct ppp_l2tp_avp_ptrs *ptrs,
+ struct ppp_l2tp_avp_list *avps)
{
/* Log */
Log(LOG_INFO, ("L2TP: connected to \"%s\", version=%u.%u",
@@ -1092,7 +1094,7 @@ ppp_l2tp_ctrl_setup_1(struct ppp_l2tp_ctrl *ctrl,
MD5_Update(&md5ctx, &ptrs->challenge->value, ptrs->challenge->length);
MD5_Final(hash, &md5ctx);
- if (ppp_l2tp_avp_list_append(ctrl->avps, 0,
+ if (ppp_l2tp_avp_list_append(avps, 0,
0, AVP_CHALLENGE_RESPONSE, hash, sizeof(hash)) == -1)
return (0);
}
@@ -2085,7 +2087,7 @@ ppp_l2tp_handle_SCCRQ(struct ppp_l2tp_ctrl *ctrl,
ok:
/* Do control connection setup */
- if (ppp_l2tp_ctrl_setup_1(ctrl, ptrs) == -1)
+ if (ppp_l2tp_ctrl_setup_1(ctrl, ptrs, ctrl->avps) == -1)
return (-1);
/* Send response and update state */
@@ -2098,18 +2100,24 @@ static int
ppp_l2tp_handle_SCCRP(struct ppp_l2tp_ctrl *ctrl,
const struct ppp_l2tp_avp_list *avps, struct ppp_l2tp_avp_ptrs *ptrs)
{
+ struct ppp_l2tp_avp_list *avps0;
+
(void)avps;
+ avps0 = ppp_l2tp_avp_list_create();
+
/* Do control connection setup */
- if (ppp_l2tp_ctrl_setup_1(ctrl, ptrs) == -1)
+ if ((ppp_l2tp_ctrl_setup_1(ctrl, ptrs, avps0) == -1) ||
+ (ppp_l2tp_ctrl_setup_2(ctrl, ptrs) == -1)) {
+ ppp_l2tp_avp_list_destroy(&avps0);
return (-1);
- if (ppp_l2tp_ctrl_setup_2(ctrl, ptrs) == -1)
- return (-1);
+ }
/* Send response and update state */
ctrl->state = CS_ESTABLISHED;
- ppp_l2tp_ctrl_send(ctrl, 0, SCCCN, ctrl->avps);
+ ppp_l2tp_ctrl_send(ctrl, 0, SCCCN, avps0);
if (*ctrl->cb->ctrl_connected != NULL)
(*ctrl->cb->ctrl_connected)(ctrl);
+ ppp_l2tp_avp_list_destroy(&avps0);
return (0);
}