diff options
Diffstat (limited to 'src/mm-modem-helpers.c')
-rw-r--r-- | src/mm-modem-helpers.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/mm-modem-helpers.c b/src/mm-modem-helpers.c index cf80f07b..9c86ebc2 100644 --- a/src/mm-modem-helpers.c +++ b/src/mm-modem-helpers.c @@ -1892,8 +1892,9 @@ mm_3gpp_get_ip_family_from_pdp_type (const gchar *pdp_type) /*************************************************************************/ char * -mm_3gpp_parse_iccid (const char *raw_iccid, gboolean swap, GError **error) +mm_3gpp_parse_iccid (const char *raw_iccid, GError **error) { + gboolean swap; char *buf, *swapped = NULL; gsize len = 0; int f_pos = -1, i; @@ -1934,6 +1935,22 @@ mm_3gpp_parse_iccid (const char *raw_iccid, gboolean swap, GError **error) goto error; } + /* The leading two digits of an ICCID is the major industry identifier and + * should be '89' for telecommunication purposes according to ISO/IEC 7812. + */ + if (buf[0] == '8' && buf[1] == '9') { + swap = FALSE; + } else if (buf[0] == '9' && buf[1] == '8') { + swap = TRUE; + } else { + /* FIXME: Instead of erroring out, revisit this solution if we find any SIM + * that doesn't use '89' as the major industry identifier of the ICCID. + */ + g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "Invalid ICCID response (leading two digits are not 89)"); + goto error; + } + /* Ensure if there's an 'F' that it's second-to-last if swap = TRUE, * otherwise last if swap = FALSE */ if (f_pos >= 0) { |