aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2010-05-16 16:30:42 +0800
committerHolger Hans Peter Freyther <zecke@selfish.org>2010-05-16 20:45:15 +0800
commitddbb5a4e1ea2199f633e93df758639d61ec1028c (patch)
tree1ec9fbd17850ae4a49ba85c510e7a3229c11146c /openbsc
parent75042b80be042be97043587463cb0f4cdce93256 (diff)
[nat] Do not access the con after the removal
In case of a RLC message we will destroy the SCCP connection. This means that accessing the con and con->bsc will access old memory. Keep the status local and move the con into an inner scope.
Diffstat (limited to 'openbsc')
-rw-r--r--openbsc/src/nat/bsc_nat.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/openbsc/src/nat/bsc_nat.c b/openbsc/src/nat/bsc_nat.c
index e2f15e79e..615654c4d 100644
--- a/openbsc/src/nat/bsc_nat.c
+++ b/openbsc/src/nat/bsc_nat.c
@@ -608,8 +608,9 @@ static void ipaccess_auth_bsc(struct tlv_parsed *tvp, struct bsc_connection *bsc
static int forward_sccp_to_msc(struct bsc_connection *bsc, struct msgb *msg)
{
+ int con_found = 0;
+ struct bsc_connection *con_bsc = NULL;
int con_type;
- struct sccp_connections *con;
struct bsc_nat_parsed *parsed;
/* Parse and filter messages */
@@ -637,6 +638,7 @@ static int forward_sccp_to_msc(struct bsc_connection *bsc, struct msgb *msg)
/* modify the SCCP entries */
if (parsed->ipa_proto == IPAC_PROTO_SCCP) {
+ struct sccp_connections *con;
switch (parsed->sccp_type) {
case SCCP_MSG_TYPE_CR:
if (bsc_nat_filter_sccp_cr(bsc, msg, parsed, &con_type) != 0)
@@ -645,6 +647,8 @@ static int forward_sccp_to_msc(struct bsc_connection *bsc, struct msgb *msg)
goto exit2;
con = patch_sccp_src_ref_to_msc(msg, parsed, bsc);
con->con_type = con_type;
+ con_found = 1;
+ con_bsc = con->bsc;
break;
case SCCP_MSG_TYPE_RLSD:
case SCCP_MSG_TYPE_CREF:
@@ -652,9 +656,17 @@ static int forward_sccp_to_msc(struct bsc_connection *bsc, struct msgb *msg)
case SCCP_MSG_TYPE_CC:
case SCCP_MSG_TYPE_IT:
con = patch_sccp_src_ref_to_msc(msg, parsed, bsc);
+ if (con) {
+ con_found = 1;
+ con_bsc = con->bsc;
+ }
break;
case SCCP_MSG_TYPE_RLC:
con = patch_sccp_src_ref_to_msc(msg, parsed, bsc);
+ if (con) {
+ con_found = 1;
+ con_bsc = con->bsc;
+ }
remove_sccp_src_ref(bsc, msg, parsed);
break;
case SCCP_MSG_TYPE_UDT:
@@ -675,9 +687,9 @@ static int forward_sccp_to_msc(struct bsc_connection *bsc, struct msgb *msg)
goto exit2;
}
- if (con && con->bsc != bsc) {
+ if (con_found && con_bsc != bsc) {
LOGP(DNAT, LOGL_ERROR, "The connection belongs to a different BTS: input: %d con: %d\n",
- bsc->cfg->nr, con->bsc->cfg->nr);
+ bsc->cfg->nr, con_bsc->cfg->nr);
goto exit2;
}