aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax <msuraev@sysmocom.de>2017-10-12 13:54:12 +0200
committerHarald Welte <laforge@gnumonks.org>2017-10-23 18:12:45 +0000
commit36fa0bd0792fe544cd242b7fcee8180685f4c203 (patch)
treed78981683af0429b16dab90ad26c96bd07a66f13
parent0a21b7a5f842b51c110c039f08d8e814b295745f (diff)
Fix race condition in attribute reporting
Previously it could be possible that the attribute request comes from BSC before the TRX is properly initialized which would lead to SIGABRT caused by OSMO_ASSERT() in PHY instantiation. Workaround this by explicitly checking for TRX availability before handling TRX-specific attributes. This only happens with osmo-bts-trx and is hard to reproduce. Ideal fix would be to defer attribute response until we have TRX connected but that would make corresponding code more complex because we'll need to save the attribute request and properly hook response routine into TRX connection handler. Alternatively we can postpone osmo-bts-trx connection to BSC until TRX is available: it's not very useful without it anyway. Change-Id: Id36885e507c4a3203b5662c0fde12c5206174d82 Fixes: OS#2560
-rw-r--r--src/common/oml.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/common/oml.c b/src/common/oml.c
index 69a26425..ff6dc417 100644
--- a/src/common/oml.c
+++ b/src/common/oml.c
@@ -214,14 +214,23 @@ static inline int handle_attrs_trx(uint8_t *out, struct gsm_bts_trx *trx, const
return -ENOMEM;
for (i = 0; i < attr_len; i++) {
+ bool processed = false;
switch (attr[i]) {
case NM_ATT_SW_CONFIG:
- add_trx_attr(attr_buf, trx);
+ if (trx) {
+ add_trx_attr(attr_buf, trx);
+ processed = true;
+ } else
+ LOGP(DOML, LOGL_ERROR, "O&M Get Attributes [%u], %s is unhandled due to missing TRX.\n",
+ i, get_value_string(abis_nm_att_names, attr[i]));
break;
default:
LOGP(DOML, LOGL_ERROR, "O&M Get Attributes [%u], %s is unsupported by TRX.\n", i,
get_value_string(abis_nm_att_names, attr[i]));
- out[attr_out_index] = attr[i]; /* assemble values of supported attributes and list of unsupported ones */
+ }
+ /* assemble values of supported attributes and list of unsupported ones */
+ if (!processed) {
+ out[attr_out_index] = attr[i];
attr_out_index++;
}
}