From ba1c49028fa9cef24c3f4fef91e5d3123affd24b Mon Sep 17 00:00:00 2001 From: Oliver Smith Date: Thu, 24 Mar 2022 13:00:36 +0100 Subject: [PATCH] Proper exit if bsc_nat_fsm fails to start Instead of segfaulting later on, properly exit if the bsc_nat_fsm does not start. One reason for having it fail could be a missing mgw pool config block. Related: SYS#5560 Change-Id: Ia8bbe6ae908d5c3ce49f71b43c950497aeebb6d6 --- include/osmocom/bsc_nat/bsc_nat_fsm.h | 2 +- src/osmo-bsc-nat/bsc_nat_fsm.c | 13 +++++++++++-- src/osmo-bsc-nat/main.c | 3 ++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/include/osmocom/bsc_nat/bsc_nat_fsm.h b/include/osmocom/bsc_nat/bsc_nat_fsm.h index a2becfb..bca97e1 100644 --- a/include/osmocom/bsc_nat/bsc_nat_fsm.h +++ b/include/osmocom/bsc_nat/bsc_nat_fsm.h @@ -20,5 +20,5 @@ #pragma once void bsc_nat_fsm_alloc(struct bsc_nat *bsc_nat); -void bsc_nat_fsm_start(struct bsc_nat *bsc_nat); +int bsc_nat_fsm_start(struct bsc_nat *bsc_nat); void bsc_nat_fsm_stop(struct bsc_nat *bsc_nat); diff --git a/src/osmo-bsc-nat/bsc_nat_fsm.c b/src/osmo-bsc-nat/bsc_nat_fsm.c index 30486ce..eae2f5e 100644 --- a/src/osmo-bsc-nat/bsc_nat_fsm.c +++ b/src/osmo-bsc-nat/bsc_nat_fsm.c @@ -474,9 +474,18 @@ void bsc_nat_fsm_alloc(struct bsc_nat *bsc_nat) OSMO_ASSERT(bsc_nat->fi); } -void bsc_nat_fsm_start(struct bsc_nat *bsc_nat) +int bsc_nat_fsm_start(struct bsc_nat *bsc_nat) { - osmo_fsm_inst_dispatch(bsc_nat->fi, BSC_NAT_FSM_EV_START, NULL); + int rc = osmo_fsm_inst_dispatch(bsc_nat->fi, BSC_NAT_FSM_EV_START, NULL); + if (rc) + return rc; + + /* st_starting_on_enter() doesn't change to STARTED if e.g. vty config + * is incomplete */ + if (bsc_nat->fi->state != BSC_NAT_FSM_ST_STARTED) + return -1; + + return 0; } void bsc_nat_fsm_stop(struct bsc_nat *bsc_nat) diff --git a/src/osmo-bsc-nat/main.c b/src/osmo-bsc-nat/main.c index 6cb1e0f..e58d687 100644 --- a/src/osmo-bsc-nat/main.c +++ b/src/osmo-bsc-nat/main.c @@ -198,7 +198,8 @@ int main(int argc, char **argv) main_vty_init(argc, argv); signal_handler_init(); - bsc_nat_fsm_start(g_bsc_nat); + if (bsc_nat_fsm_start(g_bsc_nat) < 0) + exit(1); if (msc_alloc_from_addr_book() < 0) exit(1);