summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/stkutil.c10
-rw-r--r--src/stkutil.h19
2 files changed, 22 insertions, 7 deletions
diff --git a/src/stkutil.c b/src/stkutil.c
index d5d963f7..136efd59 100644
--- a/src/stkutil.c
+++ b/src/stkutil.c
@@ -95,8 +95,8 @@ static gboolean parse_dataobj_alpha_id(struct comprehension_tlv_iter *iter,
}
/* Defined in TS 102.223 Section 8.3 */
-static gboolean parse_dataobj_subaddress(
- struct comprehension_tlv_iter *iter, void *user)
+static gboolean parse_dataobj_subaddress(struct comprehension_tlv_iter *iter,
+ void *user)
{
struct stk_subaddress *subaddr = user;
const unsigned char *data;
@@ -110,9 +110,11 @@ static gboolean parse_dataobj_subaddress(
if (len < 1)
return FALSE;
+ if (len > sizeof(subaddr->subaddr))
+ return FALSE;
+
data = comprehension_tlv_iter_get_data(iter);
- subaddr->subaddr_len = len;
- subaddr->subaddr = g_malloc(len);
+ subaddr->len = len;
memcpy(subaddr->subaddr, data, len);
return TRUE;
diff --git a/src/stkutil.h b/src/stkutil.h
index b67bbefe..d225dd45 100644
--- a/src/stkutil.h
+++ b/src/stkutil.h
@@ -198,10 +198,23 @@ struct stk_address {
char *number;
};
-/* Defined in TS 102.223 Section 8.3 */
+/*
+ * Defined in TS 102.223 Section 8.3
+ *
+ * The maximum size of the subaddress is different depending on the referenced
+ * specification. According to TS 24.008 Section 10.5.4.8: "The called party
+ * subaddress is a type 4 information element with a minimum length of 2 octets
+ * and a maximum length of 23 octets"
+ *
+ * According to TS 31.102 Section 4.4.2.4: "The subaddress data contains
+ * information as defined for this purpose in TS 24.008 [9]. All information
+ * defined in TS 24.008, except the information element identifier, shall be
+ * stored in the USIM. The length of this subaddress data can be up to 22
+ * bytes."
+ */
struct stk_subaddress {
- unsigned int subaddr_len;
- unsigned char *subaddr;
+ unsigned char len;
+ unsigned char *subaddr[23];
};
/* Defined in TS 102.223 Section 8.4 */