aboutsummaryrefslogtreecommitdiff
path: root/src/mm-base-sim.c
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2020-11-22 17:01:19 +0100
committerAleksander Morgado <aleksander@aleksander.es>2021-02-23 11:35:11 +0000
commit657cabcfce6794d2a2f629d63dbd56fc149dab2e (patch)
tree402bd1b6787ee65b93aad0d1b94ef9e9162e2178 /src/mm-base-sim.c
parentdbdf67e9f7c55d7f70ed94449160a7ff254359a2 (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.c85
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;
}