diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2020-11-22 17:01:19 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2021-02-23 11:35:11 +0000 |
commit | 657cabcfce6794d2a2f629d63dbd56fc149dab2e (patch) | |
tree | 402bd1b6787ee65b93aad0d1b94ef9e9162e2178 /src/mm-base-sim.c | |
parent | dbdf67e9f7c55d7f70ed94449160a7ff254359a2 (diff) |
libmm-glib,common-helpers: make hexstr2bin() return a GError
This util method checks whether the input string is a valid hex
string, so make sure we return a GError on failure.
Diffstat (limited to 'src/mm-base-sim.c')
-rw-r--r-- | src/mm-base-sim.c | 85 |
1 files changed, 29 insertions, 56 deletions
diff --git a/src/mm-base-sim.c b/src/mm-base-sim.c index 85051191..95273292 100644 --- a/src/mm-base-sim.c +++ b/src/mm-base-sim.c @@ -1291,9 +1291,9 @@ static guint parse_mnc_length (const gchar *response, GError **error) { - guint sw1 = 0; - guint sw2 = 0; - gchar *hex = 0; + guint sw1 = 0; + guint sw2 = 0; + g_autofree gchar *hex = NULL; if (!mm_3gpp_parse_crsm_response (response, &sw1, @@ -1306,47 +1306,34 @@ parse_mnc_length (const gchar *response, (sw1 == 0x91) || (sw1 == 0x92) || (sw1 == 0x9f)) { - gsize buflen = 0; - guint32 mnc_len; - gchar *bin; + gsize buflen = 0; + guint32 mnc_len; + g_autofree gchar *bin = NULL; /* Convert hex string to binary */ - bin = mm_utils_hexstr2bin (hex, &buflen); - if (!bin || buflen < 4) { - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_FAILED, - "SIM returned malformed response '%s'", - hex); - g_free (bin); - g_free (hex); + bin = mm_utils_hexstr2bin (hex, &buflen, error); + if (!bin) { + g_prefix_error (error, "SIM returned malformed response '%s': ", hex); + return 0; + } + if (buflen < 4) { + g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "SIM returned malformed response '%s': too short", hex); return 0; } - - g_free (hex); /* MNC length is byte 4 of this SIM file */ mnc_len = bin[3] & 0xFF; - if (mnc_len == 2 || mnc_len == 3) { - g_free (bin); + if (mnc_len == 2 || mnc_len == 3) return mnc_len; - } - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_FAILED, - "SIM returned invalid MNC length %d (should be either 2 or 3)", - mnc_len); - g_free (bin); + g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "SIM returned invalid MNC length %d (should be either 2 or 3)", mnc_len); return 0; } - g_free (hex); - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_FAILED, - "SIM failed to handle CRSM request (sw1 %d sw2 %d)", - sw1, sw2); + g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "SIM failed to handle CRSM request (sw1 %d sw2 %d)", sw1, sw2); return 0; } @@ -1410,9 +1397,9 @@ static gchar * parse_spn (const gchar *response, GError **error) { - guint sw1 = 0; - guint sw2 = 0; - gchar *hex = 0; + guint sw1 = 0; + guint sw2 = 0; + g_autofree gchar *hex = NULL; if (!mm_3gpp_parse_crsm_response (response, &sw1, @@ -1425,40 +1412,26 @@ parse_spn (const gchar *response, (sw1 == 0x91) || (sw1 == 0x92) || (sw1 == 0x9f)) { - gsize buflen = 0; - gchar *bin; - gchar *utf8; + gsize buflen = 0; + g_autofree gchar *bin = NULL; /* Convert hex string to binary */ - bin = mm_utils_hexstr2bin (hex, &buflen); + bin = mm_utils_hexstr2bin (hex, &buflen, error); if (!bin) { - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_FAILED, - "SIM returned malformed response '%s'", - hex); - g_free (hex); + g_prefix_error (error, "SIM returned malformed response '%s': ", hex); return NULL; } - g_free (hex); - /* Remove the FF filler at the end */ while (buflen > 1 && bin[buflen - 1] == (char)0xff) buflen--; /* First byte is metadata; remainder is GSM-7 unpacked into octets; convert to UTF8 */ - utf8 = (gchar *)mm_charset_gsm_unpacked_to_utf8 ((guint8 *)bin + 1, buflen - 1); - g_free (bin); - return utf8; + return (gchar *)mm_charset_gsm_unpacked_to_utf8 ((guint8 *)bin + 1, buflen - 1); } - g_free (hex); - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_FAILED, - "SIM failed to handle CRSM request (sw1 %d sw2 %d)", - sw1, sw2); + g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "SIM failed to handle CRSM request (sw1 %d sw2 %d)", sw1, sw2); return NULL; } |