Skip to content

Commit

Permalink
[GTP] avoid abort for ogs_gtp_node_new() (#1633)
Browse files Browse the repository at this point in the history
  • Loading branch information
acetcom committed Jun 29, 2022
1 parent c5a5450 commit 52d5c61
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 11 deletions.
12 changes: 10 additions & 2 deletions lib/core/ogs-3gpp-types.c
Original file line number Diff line number Diff line change
Expand Up @@ -427,12 +427,19 @@ int ogs_ip_to_sockaddr(ogs_ip_t *ip, uint16_t port, ogs_sockaddr_t **list)
ogs_assert(list);

addr = ogs_calloc(1, sizeof(ogs_sockaddr_t));
ogs_expect_or_return_val(addr, OGS_ERROR);
if (!addr) {
ogs_error("ogs_calloc() failed");
return OGS_ERROR;
}
addr->ogs_sa_family = AF_INET;
addr->ogs_sin_port = htobe16(port);

addr6 = ogs_calloc(1, sizeof(ogs_sockaddr_t));
ogs_expect_or_return_val(addr6, OGS_ERROR);
if (!addr6) {
ogs_error("ogs_calloc() failed");
ogs_free(addr);
return OGS_ERROR;
}
addr6->ogs_sa_family = AF_INET6;
addr6->ogs_sin_port = htobe16(port);

Expand All @@ -454,6 +461,7 @@ int ogs_ip_to_sockaddr(ogs_ip_t *ip, uint16_t port, ogs_sockaddr_t **list)

*list = addr6;
} else {
ogs_error("No IPv4 and IPv6");
ogs_free(addr);
ogs_free(addr6);
return OGS_ERROR;
Expand Down
36 changes: 29 additions & 7 deletions lib/gtp/context.c
Original file line number Diff line number Diff line change
Expand Up @@ -570,18 +570,29 @@ ogs_gtp_node_t *ogs_gtp_node_add_by_f_teid(
ogs_app()->parameter.no_ipv4,
ogs_app()->parameter.no_ipv6,
ogs_app()->parameter.prefer_ipv4);
ogs_assert(addr);
if (!addr) {
ogs_error("ogs_filter_ip_version() failed");
return NULL;
}

#if 0 /* deprecated */
rv = ogs_socknode_fill_scope_id_in_local(addr);
ogs_assert(rv == OGS_OK);
#endif

node = ogs_gtp_node_new(addr);
ogs_expect_or_return_val(node, NULL);
if (!node) {
ogs_error("ogs_gtp_node_new() failed");
ogs_freeaddrinfo(addr);
return NULL;
}

rv = ogs_gtp2_f_teid_to_ip(f_teid, &node->ip);
ogs_expect_or_return_val(rv == OGS_OK, NULL);
if (rv != OGS_OK) {
ogs_error("ogs_gtp2_f_teid_to_ip() failed");
ogs_freeaddrinfo(addr);
return NULL;
}

ogs_list_add(list, node);

Expand All @@ -598,7 +609,11 @@ ogs_gtp_node_t *ogs_gtp_node_add_by_addr(ogs_list_t *list, ogs_sockaddr_t *addr)

ogs_assert(OGS_OK == ogs_copyaddrinfo(&new, addr));
gnode = ogs_gtp_node_new(new);
ogs_expect_or_return_val(gnode, NULL);
if (!gnode) {
ogs_error("ogs_gtp_node_new() failed");
ogs_freeaddrinfo(new);
return NULL;
}

memcpy(&gnode->addr, new, sizeof gnode->addr);

Expand Down Expand Up @@ -680,15 +695,22 @@ ogs_gtp_node_t *ogs_gtp_node_add_by_ip(
ogs_app()->parameter.no_ipv4,
ogs_app()->parameter.no_ipv6,
ogs_app()->parameter.prefer_ipv4);
ogs_expect_or_return_val(addr, NULL);
if (!addr) {
ogs_error("ogs_filter_ip_version() failed");
return NULL;
}

#if 0 /* deprecated */
rv = ogs_socknode_fill_scope_id_in_local(addr);
ogs_expect_or_return_val(rv == OGS_OK, NULL);
ogs_assert(rv == OGS_OK);
#endif

node = ogs_gtp_node_new(addr);
ogs_expect_or_return_val(node, NULL);
if (!node) {
ogs_error("ogs_gtp_node_new() failed");
ogs_freeaddrinfo(addr);
return NULL;
}

memcpy(&node->ip, ip, sizeof(*ip));

Expand Down
8 changes: 6 additions & 2 deletions lib/gtp/v2/conv.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,11 @@ int ogs_gtp2_f_teid_to_sockaddr(
addr->ogs_sin_port = htobe16(port);

addr6 = ogs_calloc(1, sizeof(ogs_sockaddr_t));
ogs_expect_or_return_val(addr6, OGS_ERROR);
if (!addr6) {
ogs_error("ogs_calloc() failed");
ogs_free(addr);
return OGS_ERROR;
}
addr6->ogs_sa_family = AF_INET6;
addr6->ogs_sin_port = htobe16(port);

Expand All @@ -55,9 +59,9 @@ int ogs_gtp2_f_teid_to_sockaddr(

*list = addr6;
} else {
ogs_error("No IPv4 or IPv6");
ogs_free(addr);
ogs_free(addr6);
ogs_error("No IPv4 or IPv6");
return OGS_ERROR;
}

Expand Down

0 comments on commit 52d5c61

Please sign in to comment.