diff options
author | Harald Welte <laforge@osmocom.org> | 2021-02-07 12:33:28 +0100 |
---|---|---|
committer | laforge <laforge@osmocom.org> | 2021-02-08 10:40:46 +0000 |
commit | 1153675012135a975eeb9462e038bad580e9a6f8 (patch) | |
tree | fa970f194f6e90e111c9aefc8e69b6f96fa764c0 | |
parent | 2aebd133ac2bdb1a12635e146e8886b2440d4419 (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.h | 2 | ||||
-rw-r--r-- | src/xua_msg.c | 23 |
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; |