summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax <msuraev@sysmocom.de>2018-01-24 12:33:05 +0100
committerMax <msuraev@sysmocom.de>2018-02-05 13:03:42 +0100
commit80f4c4eb089e87cb1a9c6843b60836b7a6952164 (patch)
treea236b8f0384fbd95b91ddcfca5d12b4cc9dab7ac
parent18c014de6771a3032308123af9969c966e20b7c8 (diff)
GSUP: change osmo_gsup_encode() return type
* match return type of osmo_gsup_encode() with osmo_gsup_decode() to allow propagating error to caller * check return value of osmo_gsup_encode() in GSUP test * return errors instead of braking app with aseert Change-Id: Idaa1deecb6d9e15329bd51867b4f6a03357461f0 Related: OS#2864
-rw-r--r--include/osmocom/gsm/gsup.h2
-rw-r--r--src/gsm/gsup.c13
-rw-r--r--tests/gsup/gsup_test.c4
3 files changed, 13 insertions, 6 deletions
diff --git a/include/osmocom/gsm/gsup.h b/include/osmocom/gsm/gsup.h
index 5cfe1ec1..1a8a3b27 100644
--- a/include/osmocom/gsm/gsup.h
+++ b/include/osmocom/gsm/gsup.h
@@ -179,6 +179,6 @@ struct osmo_gsup_message {
int osmo_gsup_decode(const uint8_t *data, size_t data_len,
struct osmo_gsup_message *gsup_msg);
-void osmo_gsup_encode(struct msgb *msg, const struct osmo_gsup_message *gsup_msg);
+int osmo_gsup_encode(struct msgb *msg, const struct osmo_gsup_message *gsup_msg);
/*! @} */
diff --git a/src/gsm/gsup.c b/src/gsm/gsup.c
index eb829f7c..b6ac56d9 100644
--- a/src/gsm/gsup.c
+++ b/src/gsm/gsup.c
@@ -475,8 +475,9 @@ static void encode_auth_info(struct msgb *msg, enum osmo_gsup_iei iei,
/*! Encode a GSUP message
* \param[out] msg message buffer to which encoded message is written
* \param[in] gsup_msg \ref osmo_gsup_message data to be encoded
+ * \returns 0 on success; negative otherwise
*/
-void osmo_gsup_encode(struct msgb *msg, const struct osmo_gsup_message *gsup_msg)
+int osmo_gsup_encode(struct msgb *msg, const struct osmo_gsup_message *gsup_msg)
{
uint8_t u8;
int idx;
@@ -484,14 +485,16 @@ void osmo_gsup_encode(struct msgb *msg, const struct osmo_gsup_message *gsup_msg
size_t bcd_len;
/* generic part */
- OSMO_ASSERT(gsup_msg->message_type);
+ if(!gsup_msg->message_type)
+ return -ENOMEM;
+
msgb_v_put(msg, gsup_msg->message_type);
bcd_len = gsm48_encode_bcd_number(bcd_buf, sizeof(bcd_buf), 0,
gsup_msg->imsi);
- OSMO_ASSERT(bcd_len > 1);
- OSMO_ASSERT(bcd_len <= sizeof(bcd_buf));
+ if (bcd_len <= 0 || bcd_len > sizeof(bcd_buf))
+ return -EINVAL;
/* Note that gsm48_encode_bcd_number puts the length into the first
* octet. Since msgb_tlv_put will add this length byte, we'll have to
@@ -560,6 +563,8 @@ void osmo_gsup_encode(struct msgb *msg, const struct osmo_gsup_message *gsup_msg
msgb_tlv_put(msg, OSMO_GSUP_CHARG_CHAR_IE,
gsup_msg->pdp_charg_enc_len, gsup_msg->pdp_charg_enc);
}
+
+ return 0;
}
/*! @} */
diff --git a/tests/gsup/gsup_test.c b/tests/gsup/gsup_test.c
index eddcc924..b55f1d97 100644
--- a/tests/gsup/gsup_test.c
+++ b/tests/gsup/gsup_test.c
@@ -220,7 +220,9 @@ static void test_gsup_messages_dec_enc(void)
if (rc < 0)
passed = false;
- osmo_gsup_encode(msg, &gm);
+ rc = osmo_gsup_encode(msg, &gm);
+ if (rc < 0)
+ passed = false;
fprintf(stderr, " generated message: %s\n", msgb_hexdump(msg));
fprintf(stderr, " original message: %s\n", osmo_hexdump(t->data, t->data_len));