Skip to content

Commit 7ff3a8f

Browse files
committed
pfcp: fix teid leak during session deletion
Release teid previously allocated while releasing session. Signed-off-by: Alexandre Cassen <acassen@gmail.com>
1 parent 0cf2637 commit 7ff3a8f

File tree

7 files changed

+32
-1
lines changed

7 files changed

+32
-1
lines changed

lib/pkt_buffer.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ __pkt_queue_get(struct pkt_queue *q)
112112
list_del_init(&pkt->next);
113113
__sync_sub_and_fetch(&q->size, 1);
114114
pkt_buffer_reset(pkt->pbuff);
115+
memset(pkt->pbuff->head, 0, pkt_buffer_size(pkt->pbuff));
115116
return pkt;
116117
}
117118

src/pfcp/include/pfcp_session.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ struct pfcp_session *pfcp_session_alloc(struct gtp_conn *c,
216216

217217
int pfcp_session_alloc_ue_ip(struct pfcp_session *s, sa_family_t af);
218218
int pfcp_session_release_ue_ip(struct pfcp_session *s);
219+
int pfcp_session_release_teid(struct pfcp_session *s);
219220
int pfcp_session_destroy(struct pfcp_session *s);
220221
int pfcp_sessions_release(struct gtp_conn *c);
221222
int pfcp_sessions_free(struct gtp_conn *c);

src/pfcp/pfcp_proto_hdl.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ pfcp_assoc_setup_request_send(struct thread *t)
200200

201201
/* Prepare pkt */
202202
pbuff = p->pbuff;
203+
memset(pbuff->head, 0, pkt_buffer_size(pbuff));
203204
pfcph = (struct pfcp_hdr *) pbuff->head;
204205
pfcph->version = 1;
205206
pfcph->type = PFCP_ASSOCIATION_SETUP_REQUEST;

src/pfcp/pfcp_session.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,7 @@ pfcp_session_release(struct pfcp_session *s)
346346
list_head_del(&s->next);
347347
pfcp_session_unhash(s);
348348
pfcp_session_release_ue_ip(s);
349+
pfcp_session_release_teid(s);
349350
pfcp_session_free(s);
350351
return 0;
351352
}

src/pfcp/pfcp_session_ctx.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,31 @@ pfcp_session_destroy_teid(struct pfcp_session *s, struct traffic_endpoint *te,
189189
return 0;
190190
}
191191

192+
int
193+
pfcp_session_release_teid(struct pfcp_session *s)
194+
{
195+
struct pdr *pdr;
196+
struct traffic_endpoint *te;
197+
int i, j;
198+
199+
/* Non-optimized pdi */
200+
for (i = 0; i < PFCP_MAX_NR_ELEM && s->pdr[i].id; i++) {
201+
pdr = &s->pdr[i];
202+
203+
for (j = 0; j < PFCP_DIR_MAX; j++)
204+
pfcp_teid_free(pdr->teid[j]);
205+
}
206+
207+
/* Optimized PDI */
208+
for (i = 0; i < PFCP_MAX_NR_ELEM && s->te[i].id; i++) {
209+
te = &s->te[i];
210+
211+
for (j = 0; j < PFCP_DIR_MAX; j++)
212+
pfcp_teid_free(te->teid[j]);
213+
}
214+
215+
return 0;
216+
}
192217

193218
static int
194219
pfcp_session_create_te(struct pfcp_session *s, struct traffic_endpoint *te,

src/pfcp/pfcp_session_report.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ pfcp_session_report_send(struct thread *t)
8585

8686
/* Pkt building */
8787
pbuff = p->pbuff;
88-
memset(pbuff->head, 0, pkt_buffer_size(pbuff));
8988
pfcp_msg_header_init(pbuff, PFCP_SESSION_REPORT_REQUEST, remote_seid->id,
9089
htonl(srv->seqn++));
9190
err = pfcp_ie_put_report_type(pbuff, PFCP_IE_REPORT_TYPE_USAR);

src/pfcp/pfcp_teid.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,9 @@ pfcp_teid_alloc_static(struct hlist_head *h, uint8_t interface,
344344
void
345345
pfcp_teid_free(struct pfcp_teid *t)
346346
{
347+
if (!t)
348+
return;
349+
347350
pfcp_teid_unhash(t);
348351
free(t);
349352
}

0 commit comments

Comments
 (0)