aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2021-02-07 12:33:28 +0100
committerlaforge <laforge@osmocom.org>2021-02-08 10:40:46 +0000
commit1153675012135a975eeb9462e038bad580e9a6f8 (patch)
treefa970f194f6e90e111c9aefc8e69b6f96fa764c0
parent2aebd133ac2bdb1a12635e146e8886b2440d4419 (diff)
xua_msg: Add xua_msg*_get_str() to obtain string IE
We copy the contents to a static thread-local buffer to ensure zero termination of the string received by a remote entity. Change-Id: I8cbb7aeaf0cb64db0ce01c21e5fca9ab3cd932b6
-rw-r--r--include/osmocom/sigtran/xua_msg.h2
-rw-r--r--src/xua_msg.c23
2 files changed, 25 insertions, 0 deletions
diff --git a/include/osmocom/sigtran/xua_msg.h b/include/osmocom/sigtran/xua_msg.h
index a2cdbf2..329ba96 100644
--- a/include/osmocom/sigtran/xua_msg.h
+++ b/include/osmocom/sigtran/xua_msg.h
@@ -91,6 +91,8 @@ int msgb_t16l16vp_put_u32(struct msgb *msg, uint16_t tag, uint32_t val);
int xua_msg_add_u32(struct xua_msg *xua, uint16_t iei, uint32_t val);
uint32_t xua_msg_part_get_u32(const struct xua_msg_part *part);
uint32_t xua_msg_get_u32(const struct xua_msg *xua, uint16_t iei);
+const char *xua_msg_part_get_str(const struct xua_msg_part *part);
+const char *xua_msg_get_str(const struct xua_msg *xua, uint16_t iei);
void xua_part_add_gt(struct msgb *msg, const struct osmo_sccp_gt *gt);
int xua_msg_add_sccp_addr(struct xua_msg *xua, uint16_t iei, const struct osmo_sccp_addr *addr);
diff --git a/src/xua_msg.c b/src/xua_msg.c
index 79c358c..42c580d 100644
--- a/src/xua_msg.c
+++ b/src/xua_msg.c
@@ -297,6 +297,29 @@ uint32_t xua_msg_get_u32(const struct xua_msg *xua, uint16_t iei)
return xua_msg_part_get_u32(part);
}
+const char *xua_msg_part_get_str(const struct xua_msg_part *part)
+{
+ static char __thread buf[256];
+
+ if (part->len == 0)
+ return "";
+ /* RFC3868 3.9.4: Length of the INFO String parameter is from 0 to 255 octets */
+ if (part->len > 255)
+ return "<invalid-string-len>";
+
+ memcpy(buf, part->dat, part->len);
+ buf[part->len] = '\0';
+ return buf;
+}
+
+const char *xua_msg_get_str(const struct xua_msg *xua, uint16_t iei)
+{
+ struct xua_msg_part *part = xua_msg_find_tag(xua, iei);
+ if (!part)
+ return NULL;
+ return xua_msg_part_get_str(part);
+}
+
void xua_part_add_gt(struct msgb *msg, const struct osmo_sccp_gt *gt)
{
uint16_t *len_ptr;