gtphub: fix numerous segfaults, and other stupidities.
Initialize llist_heads to empty (2 were missing). Move those for struct gtphub
instances to gtphub_zero() (one moved, one added).
In from_[gs]gsns_read_cb(), use a return type that can actually reflect
negative return values.
resolved_addr.buf: no need to take the address of a byte array var
(cosmetic).
Pass the proper user data address to sgsn_ares_query(), not the address of
the pointer holding the user data address.
Initialize ggsn_lookup->expiry_entry (was missing). Publish the function for that
in gtphub.h so gtphub_ext.c can use it.
Sponsored-by: On-Waves ehi
diff --git a/openbsc/src/gprs/gtphub.c b/openbsc/src/gprs/gtphub.c
index b3638fe..f0c96bc 100644
--- a/openbsc/src/gprs/gtphub.c
+++ b/openbsc/src/gprs/gtphub.c
@@ -718,6 +718,8 @@
static void gtphub_zero(struct gtphub *hub)
{
ZERO_STRUCT(hub);
+ INIT_LLIST_HEAD(&hub->ggsn_lookups);
+ INIT_LLIST_HEAD(&hub->resolved_ggsns);
}
static int gtphub_sock_init(struct osmo_fd *ofd,
@@ -1243,7 +1245,7 @@
struct osmo_sockaddr from_addr;
struct osmo_sockaddr to_addr;
struct osmo_fd *to_ofd;
- size_t len;
+ int len;
uint8_t *reply_buf;
len = gtphub_read(from_ggsns_ofd, &from_addr, buf, sizeof(buf));
@@ -1497,7 +1499,7 @@
struct osmo_sockaddr from_addr;
struct osmo_sockaddr to_addr;
struct osmo_fd *to_ofd;
- size_t len;
+ int len;
uint8_t *reply_buf;
len = gtphub_read(from_sgsns_ofd, &from_addr, buf, sizeof(buf));
@@ -1796,8 +1798,6 @@
{
gtphub_zero(hub);
- INIT_LLIST_HEAD(&hub->resolved_ggsns);
-
expiry_init(&hub->expire_seq_maps, GTPH_SEQ_MAPPING_EXPIRY_SECS);
expiry_init(&hub->expire_tei_maps, GTPH_TEI_MAPPING_EXPIRY_MINUTES * 60);