diff options
-rw-r--r-- | libmm-glib/mm-common-helpers.c | 18 | ||||
-rw-r--r-- | libmm-glib/mm-common-helpers.h | 2 | ||||
-rw-r--r-- | plugins/altair/mm-modem-helpers-altair-lte.c | 56 | ||||
-rw-r--r-- | plugins/huawei/mm-broadband-modem-huawei.c | 19 | ||||
-rw-r--r-- | plugins/huawei/mm-modem-helpers-huawei.c | 2 | ||||
-rw-r--r-- | src/mm-base-sim.c | 85 | ||||
-rw-r--r-- | src/mm-charsets.c | 2 | ||||
-rw-r--r-- | src/mm-modem-helpers-qmi.c | 20 | ||||
-rw-r--r-- | src/mm-modem-helpers.c | 5 | ||||
-rw-r--r-- | src/mm-sms-part-3gpp.c | 17 | ||||
-rw-r--r-- | src/mm-sms-part-cdma.c | 17 |
11 files changed, 90 insertions, 153 deletions
diff --git a/libmm-glib/mm-common-helpers.c b/libmm-glib/mm-common-helpers.c index da1cc1cc..b443f1ab 100644 --- a/libmm-glib/mm-common-helpers.c +++ b/libmm-glib/mm-common-helpers.c @@ -1687,10 +1687,12 @@ mm_utils_hex2byte (const gchar *hex) } gchar * -mm_utils_hexstr2bin (const gchar *hex, gsize *out_len) +mm_utils_hexstr2bin (const gchar *hex, + gsize *out_len, + GError **error) { const gchar *ipos = hex; - gchar *buf = NULL; + g_autofree gchar *buf = NULL; gsize i; gint a; gchar *opos; @@ -1699,20 +1701,26 @@ mm_utils_hexstr2bin (const gchar *hex, gsize *out_len) len = strlen (hex); /* Length must be a multiple of 2 */ - g_return_val_if_fail ((len % 2) == 0, NULL); + if ((len % 2) != 0) { + g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_INVALID_ARGS, + "Hex conversion failed: invalid input length"); + return NULL; + } opos = buf = g_malloc0 ((len / 2) + 1); for (i = 0; i < len; i += 2) { a = mm_utils_hex2byte (ipos); if (a < 0) { - g_free (buf); + g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_INVALID_ARGS, + "Hex byte conversion from '%c%c' failed", + ipos[0], ipos[1]); return NULL; } *opos++ = a; ipos += 2; } *out_len = len / 2; - return buf; + return g_steal_pointer (&buf); } /* End from hostap */ diff --git a/libmm-glib/mm-common-helpers.h b/libmm-glib/mm-common-helpers.h index 65d0e70a..d3cf62d7 100644 --- a/libmm-glib/mm-common-helpers.h +++ b/libmm-glib/mm-common-helpers.h @@ -181,7 +181,7 @@ gchar *mm_get_string_unquoted_from_match_info (GMatchInfo *match_info, const gchar *mm_sms_delivery_state_get_string_extended (guint delivery_state); gint mm_utils_hex2byte (const gchar *hex); -gchar *mm_utils_hexstr2bin (const gchar *hex, gsize *out_len); +gchar *mm_utils_hexstr2bin (const gchar *hex, gsize *out_len, GError **error); gchar *mm_utils_bin2hexstr (const guint8 *bin, gsize len); gboolean mm_utils_ishexstr (const gchar *hex); diff --git a/plugins/altair/mm-modem-helpers-altair-lte.c b/plugins/altair/mm-modem-helpers-altair-lte.c index 278f31e8..6d218800 100644 --- a/plugins/altair/mm-modem-helpers-altair-lte.c +++ b/plugins/altair/mm-modem-helpers-altair-lte.c @@ -155,9 +155,9 @@ mm_altair_parse_vendor_pco_info (const gchar *pco_info, GError **error) G_REGEX_DOLLAR_ENDONLY | G_REGEX_RAW, 0, NULL); g_assert (regex); - if (!g_regex_match_full (regex, pco_info, strlen (pco_info), 0, 0, &match_info, error)) { + + if (!g_regex_match_full (regex, pco_info, strlen (pco_info), 0, 0, &match_info, error)) return NULL; - } num_matches = g_match_info_get_match_count (match_info); if (num_matches != 5) { @@ -170,22 +170,18 @@ mm_altair_parse_vendor_pco_info (const gchar *pco_info, GError **error) } while (g_match_info_matches (match_info)) { - guint pco_cid; - gchar *pco_id; - gchar *pco_payload; - gsize pco_payload_len; - gchar *pco_payload_bytes = NULL; - gsize pco_payload_bytes_len; - guint8 pco_prefix[6]; + guint pco_cid; + g_autofree gchar *pco_id = NULL; + g_autofree gchar *pco_payload = NULL; + g_autofree gchar *pco_payload_bytes = NULL; + gsize pco_payload_bytes_len; + guint8 pco_prefix[6]; GByteArray *pco_raw; - gsize pco_raw_len; + gsize pco_raw_len; if (!mm_get_uint_from_match_info (match_info, 1, &pco_cid)) { - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_FAILED, - "Couldn't parse CID from PCO info: '%s'", - pco_info); + g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "Couldn't parse CID from PCO info: '%s'", pco_info); break; } @@ -197,42 +193,26 @@ mm_altair_parse_vendor_pco_info (const gchar *pco_info, GError **error) pco_id = mm_get_string_unquoted_from_match_info (match_info, 3); if (!pco_id) { - g_set_error (error, - MM_CORE_ERROR, MM_CORE_ERROR_FAILED, - "Couldn't parse PCO ID from PCO info: '%s'", - pco_info); + g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "Couldn't parse PCO ID from PCO info: '%s'", pco_info); break; } if (g_strcmp0 (pco_id, "FF00")) { - g_free (pco_id); g_match_info_next (match_info, error); continue; } - g_free (pco_id); pco_payload = mm_get_string_unquoted_from_match_info (match_info, 4); if (!pco_payload) { - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_FAILED, - "Couldn't parse PCO payload from PCO info: '%s'", - pco_info); + g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "Couldn't parse PCO payload from PCO info: '%s'", pco_info); break; } - pco_payload_len = strlen (pco_payload); - if (pco_payload_len % 2 == 0) - pco_payload_bytes = mm_utils_hexstr2bin (pco_payload, &pco_payload_bytes_len); - - g_free (pco_payload); - + pco_payload_bytes = mm_utils_hexstr2bin (pco_payload, &pco_payload_bytes_len, error); if (!pco_payload_bytes) { - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_FAILED, - "Invalid PCO payload from PCO info: '%s'", - pco_info); + g_prefix_error (error, "Invalid PCO payload from PCO info '%s': ", pco_info); break; } @@ -267,13 +247,11 @@ mm_altair_parse_vendor_pco_info (const gchar *pco_info, GError **error) pco_raw = g_byte_array_sized_new (pco_raw_len); g_byte_array_append (pco_raw, pco_prefix, sizeof (pco_prefix)); g_byte_array_append (pco_raw, (guint8 *)pco_payload_bytes, pco_payload_bytes_len); - g_free (pco_payload_bytes); pco = mm_pco_new (); mm_pco_set_session_id (pco, pco_cid); mm_pco_set_complete (pco, TRUE); mm_pco_set_data (pco, pco_raw->data, pco_raw->len); - g_byte_array_unref (pco_raw); break; } diff --git a/plugins/huawei/mm-broadband-modem-huawei.c b/plugins/huawei/mm-broadband-modem-huawei.c index 19249a8c..aec926c1 100644 --- a/plugins/huawei/mm-broadband-modem-huawei.c +++ b/plugins/huawei/mm-broadband-modem-huawei.c @@ -2330,21 +2330,20 @@ decode (MMIfaceModem3gppUssd *self, const gchar *reply, GError **error) { - gchar *bin, *utf8; - guint8 *unpacked; - gsize bin_len; - guint32 unpacked_len; + g_autofree gchar *bin = NULL; + g_autofree guint8 *unpacked = NULL; + gsize bin_len = 0; + guint32 unpacked_len; + + bin = mm_utils_hexstr2bin (reply, &bin_len, error); + if (!bin) + return NULL; - bin = mm_utils_hexstr2bin (reply, &bin_len); unpacked = mm_charset_gsm_unpack ((guint8*) bin, (bin_len * 8) / 7, 0, &unpacked_len); /* if the last character in a 7-byte block is padding, then drop it */ if ((bin_len % 7 == 0) && (unpacked[unpacked_len - 1] == 0x0d)) unpacked_len--; - utf8 = (char*) mm_charset_gsm_unpacked_to_utf8 (unpacked, unpacked_len); - - g_free (bin); - g_free (unpacked); - return utf8; + return (gchar*) mm_charset_gsm_unpacked_to_utf8 (unpacked, unpacked_len); } /*****************************************************************************/ diff --git a/plugins/huawei/mm-modem-helpers-huawei.c b/plugins/huawei/mm-modem-helpers-huawei.c index 2cd94e6a..1f9fe363 100644 --- a/plugins/huawei/mm-modem-helpers-huawei.c +++ b/plugins/huawei/mm-modem-helpers-huawei.c @@ -188,7 +188,7 @@ match_info_to_ip4_addr (GMatchInfo *match_info, else g_assert_not_reached (); - bin = mm_utils_hexstr2bin (buf, &bin_len); + bin = mm_utils_hexstr2bin (buf, &bin_len, NULL); if (!bin || bin_len != 4) goto done; 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; } diff --git a/src/mm-charsets.c b/src/mm-charsets.c index 2613a660..f51e92bb 100644 --- a/src/mm-charsets.c +++ b/src/mm-charsets.c @@ -169,7 +169,7 @@ mm_modem_charset_hex_to_utf8 (const gchar *src, iconv_from = charset_iconv_from (charset); g_return_val_if_fail (iconv_from != NULL, FALSE); - unconverted = mm_utils_hexstr2bin (src, &unconverted_len); + unconverted = mm_utils_hexstr2bin (src, &unconverted_len, NULL); if (!unconverted) return NULL; diff --git a/src/mm-modem-helpers-qmi.c b/src/mm-modem-helpers-qmi.c index 8d0e4b88..4180a268 100644 --- a/src/mm-modem-helpers-qmi.c +++ b/src/mm-modem-helpers-qmi.c @@ -1811,25 +1811,19 @@ mm_firmware_unique_id_to_qmi_unique_id (const gchar *unique_id, /* The length will be exactly EXPECTED_QMI_UNIQUE_ID_LENGTH*2 if given in HEX */ if (len == (2 * EXPECTED_QMI_UNIQUE_ID_LENGTH)) { - guint8 *tmp; - gsize tmp_len; - guint i; - - for (i = 0; i < len; i++) { - if (!g_ascii_isxdigit (unique_id[i])) { - g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, - "Unexpected character found in unique id (not HEX): %c", unique_id[i]); - return NULL; - } - } + g_autofree guint8 *tmp = NULL; + gsize tmp_len; tmp_len = 0; - tmp = (guint8 *) mm_utils_hexstr2bin (unique_id, &tmp_len); + tmp = (guint8 *) mm_utils_hexstr2bin (unique_id, &tmp_len, error); + if (!tmp) { + g_prefix_error (error, "Unexpected character found in unique id: "); + return NULL; + } g_assert (tmp_len == EXPECTED_QMI_UNIQUE_ID_LENGTH); qmi_unique_id = g_array_sized_new (FALSE, FALSE, sizeof (guint8), tmp_len); g_array_insert_vals (qmi_unique_id, 0, tmp, tmp_len); - g_free (tmp); return qmi_unique_id; } diff --git a/src/mm-modem-helpers.c b/src/mm-modem-helpers.c index 3ee12aaa..a2fb07fa 100644 --- a/src/mm-modem-helpers.c +++ b/src/mm-modem-helpers.c @@ -4291,10 +4291,9 @@ mm_3gpp_parse_emergency_numbers (const char *raw, GError **error) return NULL; } - bin = (guint8 *) mm_utils_hexstr2bin (raw, &binlen); + bin = (guint8 *) mm_utils_hexstr2bin (raw, &binlen, error); if (!bin) { - g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_INVALID_ARGS, - "invalid raw emergency numbers list contents: %s", raw); + g_prefix_error (error, "invalid raw emergency numbers list contents: "); return NULL; } diff --git a/src/mm-sms-part-3gpp.c b/src/mm-sms-part-3gpp.c index dd43ac5a..bc4310ee 100644 --- a/src/mm-sms-part-3gpp.c +++ b/src/mm-sms-part-3gpp.c @@ -339,24 +339,17 @@ mm_sms_part_3gpp_new_from_pdu (guint index, gpointer log_object, GError **error) { - gsize pdu_len; - guint8 *pdu; - MMSmsPart *part; + g_autofree guint8 *pdu = NULL; + gsize pdu_len; /* Convert PDU from hex to binary */ - pdu = (guint8 *) mm_utils_hexstr2bin (hexpdu, &pdu_len); + pdu = (guint8 *) mm_utils_hexstr2bin (hexpdu, &pdu_len, error); if (!pdu) { - g_set_error_literal (error, - MM_CORE_ERROR, - MM_CORE_ERROR_FAILED, - "Couldn't convert 3GPP PDU from hex to binary"); + g_prefix_error (error, "Couldn't convert 3GPP PDU from hex to binary: "); return NULL; } - part = mm_sms_part_3gpp_new_from_binary_pdu (index, pdu, pdu_len, log_object, error); - g_free (pdu); - - return part; + return mm_sms_part_3gpp_new_from_binary_pdu (index, pdu, pdu_len, log_object, error); } MMSmsPart * diff --git a/src/mm-sms-part-cdma.c b/src/mm-sms-part-cdma.c index fcfd85e9..39e2cc2f 100644 --- a/src/mm-sms-part-cdma.c +++ b/src/mm-sms-part-cdma.c @@ -317,24 +317,17 @@ mm_sms_part_cdma_new_from_pdu (guint index, gpointer log_object, GError **error) { - gsize pdu_len; - guint8 *pdu; - MMSmsPart *part; + g_autofree guint8 *pdu = NULL; + gsize pdu_len; /* Convert PDU from hex to binary */ - pdu = (guint8 *) mm_utils_hexstr2bin (hexpdu, &pdu_len); + pdu = (guint8 *) mm_utils_hexstr2bin (hexpdu, &pdu_len, error); if (!pdu) { - g_set_error_literal (error, - MM_CORE_ERROR, - MM_CORE_ERROR_FAILED, - "Couldn't convert CDMA PDU from hex to binary"); + g_prefix_error (error, "Couldn't convert CDMA PDU from hex to binary: "); return NULL; } - part = mm_sms_part_cdma_new_from_binary_pdu (index, pdu, pdu_len, log_object, error); - g_free (pdu); - - return part; + return mm_sms_part_cdma_new_from_binary_pdu (index, pdu, pdu_len, log_object, error); } struct Parameter { |