util: Switch character conversions to ell

Switch various conversions from GSM/UCS2 to UTF8 from glib based
implementation over to ell.

This also converts all related g_free calls to l_free calls (though in
the end they are equivalent calls to free)
This commit is contained in:
Denis Kenzior 2018-12-22 16:00:19 -06:00
parent 44415e754b
commit 4059d4226b
5 changed files with 67 additions and 82 deletions

View File

@ -36,6 +36,8 @@
#include <errno.h> #include <errno.h>
#include <unistd.h> #include <unistd.h>
#include <ell/ell.h>
#include "ofono.h" #include "ofono.h"
#include "common.h" #include "common.h"
@ -349,8 +351,8 @@ static char **get_service_numbers(GSList *service_numbers)
static void service_number_free(gpointer pointer) static void service_number_free(gpointer pointer)
{ {
struct service_number *num = pointer; struct service_number *num = pointer;
g_free(num->id); l_free(num->id);
g_free(num); l_free(num);
} }
static void call_state_watches(struct ofono_sim *sim) static void call_state_watches(struct ofono_sim *sim)
@ -1285,27 +1287,26 @@ static void sim_sdn_read_cb(int ok, int length, int record,
if (sim_adn_parse(data, record_length, &ph, &alpha) == FALSE) if (sim_adn_parse(data, record_length, &ph, &alpha) == FALSE)
goto out; goto out;
/* Use phone number if Id is unavailable */ /* Use phone number if Id is unavailable */
if (alpha && alpha[0] == '\0') { if (alpha && alpha[0] == '\0') {
g_free(alpha); l_free(alpha);
alpha = NULL; alpha = NULL;
} }
if (alpha == NULL) if (alpha == NULL)
alpha = g_strdup(phone_number_to_string(&ph)); alpha = l_strdup(phone_number_to_string(&ph));
if (sim->service_numbers && if (sim->service_numbers &&
g_slist_find_custom(sim->service_numbers, g_slist_find_custom(sim->service_numbers,
alpha, service_number_compare)) { alpha, service_number_compare)) {
ofono_error("Duplicate EFsdn entries for `%s'", ofono_error("Duplicate EFsdn entries for `%s'",
alpha); alpha);
g_free(alpha); l_free(alpha);
goto out; goto out;
} }
sdn = g_new(struct service_number, 1); sdn = l_new(struct service_number, 1);
sdn->id = alpha; sdn->id = alpha;
memcpy(&sdn->ph, &ph, sizeof(struct ofono_phone_number)); memcpy(&sdn->ph, &ph, sizeof(struct ofono_phone_number));
@ -2512,10 +2513,10 @@ static void sim_spn_close(struct ofono_sim *sim)
sim->reading_spn = false; sim->reading_spn = false;
g_free(sim->spn); l_free(sim->spn);
sim->spn = NULL; sim->spn = NULL;
g_free(sim->spn_dc); l_free(sim->spn_dc);
sim->spn_dc = NULL; sim->spn_dc = NULL;
} }
@ -2829,10 +2830,10 @@ static void sim_spn_set(struct ofono_sim *sim, const void *data, int length,
DBusConnection *conn = ofono_dbus_get_connection(); DBusConnection *conn = ofono_dbus_get_connection();
const char *path = __ofono_atom_get_path(sim->atom); const char *path = __ofono_atom_get_path(sim->atom);
g_free(sim->spn); l_free(sim->spn);
sim->spn = NULL; sim->spn = NULL;
g_free(sim->spn_dc); l_free(sim->spn_dc);
sim->spn_dc = NULL; sim->spn_dc = NULL;
if (data == NULL) if (data == NULL)
@ -2861,13 +2862,13 @@ static void sim_spn_set(struct ofono_sim *sim, const void *data, int length,
} }
if (strlen(sim->spn) == 0) { if (strlen(sim->spn) == 0) {
g_free(sim->spn); l_free(sim->spn);
sim->spn = NULL; sim->spn = NULL;
goto notify; goto notify;
} }
if (dc) if (dc)
sim->spn_dc = g_memdup(dc, 1); sim->spn_dc = l_memdup(dc, 1);
notify: notify:
if (sim->spn) if (sim->spn)

View File

@ -816,9 +816,7 @@ static char *sim_network_name_parse(const unsigned char *buffer, int length,
if (buffer[i] == 0xff && buffer[i + 1] == 0xff) if (buffer[i] == 0xff && buffer[i + 1] == 0xff)
break; break;
ret = g_convert((const char *) buffer, length, ret = l_utf8_from_ucs2be(buffer, length);
"UTF-8//TRANSLIT", "UCS-2BE",
NULL, NULL, NULL);
break; break;
} }
@ -990,9 +988,9 @@ static void pnn_operator_free(struct sim_eons_operator_info *oper)
if (oper == NULL) if (oper == NULL)
return; return;
g_free(oper->info); l_free(oper->info);
g_free(oper->shortname); l_free(oper->shortname);
g_free(oper->longname); l_free(oper->longname);
} }
struct sim_eons *sim_eons_new(int pnn_records) struct sim_eons *sim_eons_new(int pnn_records)
@ -1552,7 +1550,7 @@ gboolean sim_cphs_is_active(unsigned char *cphs, enum sim_cphs_service index)
void sim_app_record_free(struct sim_app_record *app) void sim_app_record_free(struct sim_app_record *app)
{ {
g_free(app->label); l_free(app->label);
g_free(app); g_free(app);
} }
@ -1607,7 +1605,7 @@ error:
GSList *t = ret; GSList *t = ret;
struct sim_app_record *app = ret->data; struct sim_app_record *app = ret->data;
g_free(app->label); l_free(app->label);
g_free(app); g_free(app);
ret = ret->next; ret = ret->next;

View File

@ -677,10 +677,9 @@ gboolean sms_decode_address_field(const unsigned char *pdu, int len,
return FALSE; return FALSE;
utf8 = convert_gsm_to_utf8(res, written, NULL, NULL, 0); utf8 = convert_gsm_to_utf8(res, written, NULL, NULL, 0);
l_free(res); l_free(res);
if (utf8 == NULL) if (!utf8)
return FALSE; return FALSE;
/* /*
@ -688,13 +687,12 @@ gboolean sms_decode_address_field(const unsigned char *pdu, int len,
* 22 bytes+terminator in UTF-8. * 22 bytes+terminator in UTF-8.
*/ */
if (strlen(utf8) > 22) { if (strlen(utf8) > 22) {
g_free(utf8); l_free(utf8);
return FALSE; return FALSE;
} }
strcpy(out->address, utf8); strcpy(out->address, utf8);
l_free(utf8);
g_free(utf8);
} }
return TRUE; return TRUE;
@ -2294,7 +2292,7 @@ char *sms_decode_text(GSList *sms_list)
single_shift); single_shift);
if (converted) { if (converted) {
g_string_append(str, converted); g_string_append(str, converted);
g_free(converted); l_free(converted);
} }
} else { } else {
const guint8 *from = ud + taken; const guint8 *from = ud + taken;
@ -4107,7 +4105,7 @@ char *cbs_decode_text(GSList *cbs_list, char *iso639_lang)
} }
} }
buf = g_new(unsigned char, bufsize); buf = l_new(unsigned char, bufsize);
bufsize = 0; bufsize = 0;
for (l = cbs_list; l; l = l->next) { for (l = cbs_list; l; l = l->next) {
@ -4203,10 +4201,9 @@ char *cbs_decode_text(GSList *cbs_list, char *iso639_lang)
if (charset == SMS_CHARSET_7BIT) if (charset == SMS_CHARSET_7BIT)
utf8 = convert_gsm_to_utf8(buf, bufsize, NULL, NULL, 0); utf8 = convert_gsm_to_utf8(buf, bufsize, NULL, NULL, 0);
else else
utf8 = g_convert((char *) buf, bufsize, "UTF-8//TRANSLIT", utf8 = l_utf8_from_ucs2be(buf, bufsize);
"UCS-2BE", NULL, NULL, NULL);
g_free(buf); l_free(buf);
return utf8; return utf8;
} }

View File

@ -110,9 +110,7 @@ static char *decode_text(unsigned char dcs, int len, const unsigned char *data)
utf8 = convert_gsm_to_utf8(data, len, NULL, NULL, 0); utf8 = convert_gsm_to_utf8(data, len, NULL, NULL, 0);
break; break;
case SMS_CHARSET_UCS2: case SMS_CHARSET_UCS2:
utf8 = g_convert((const gchar *) data, len, utf8 = l_utf8_from_ucs2be(data, len);
"UTF-8//TRANSLIT", "UCS-2BE",
NULL, NULL, NULL);
break; break;
default: default:
utf8 = NULL; utf8 = NULL;
@ -574,7 +572,7 @@ static gboolean parse_dataobj_text(struct comprehension_tlv_iter *iter,
char *utf8; char *utf8;
if (len <= 1) { if (len <= 1) {
*text = g_try_malloc0(1); *text = l_new(char, 1);
return TRUE; return TRUE;
} }
@ -2256,8 +2254,8 @@ static dataobj_handler handler_for_type(enum stk_data_object_type type)
static void destroy_stk_item(gpointer pointer) static void destroy_stk_item(gpointer pointer)
{ {
struct stk_item *item = pointer; struct stk_item *item = pointer;
g_free(item->text); l_free(item->text);
g_free(item); l_free(item);
} }
static gboolean parse_item_list(struct comprehension_tlv_iter *iter, static gboolean parse_item_list(struct comprehension_tlv_iter *iter,
@ -2283,7 +2281,7 @@ static gboolean parse_item_list(struct comprehension_tlv_iter *iter,
} }
list = g_slist_prepend(list, list = g_slist_prepend(list,
g_memdup(&item, sizeof(item))); l_memdup(&item, sizeof(item)));
} }
} while (comprehension_tlv_iter_next(iter) == TRUE && } while (comprehension_tlv_iter_next(iter) == TRUE &&
comprehension_tlv_iter_get_tag(iter) == tag); comprehension_tlv_iter_get_tag(iter) == tag);
@ -2300,7 +2298,6 @@ static gboolean parse_item_list(struct comprehension_tlv_iter *iter,
g_slist_free_full(list, destroy_stk_item); g_slist_free_full(list, destroy_stk_item);
return FALSE; return FALSE;
} }
static gboolean parse_provisioning_list(struct comprehension_tlv_iter *iter, static gboolean parse_provisioning_list(struct comprehension_tlv_iter *iter,
@ -2432,7 +2429,7 @@ static enum stk_command_parse_result parse_dataobj(
static void destroy_display_text(struct stk_command *command) static void destroy_display_text(struct stk_command *command)
{ {
g_free(command->display_text.text); l_free(command->display_text.text);
} }
static enum stk_command_parse_result parse_display_text( static enum stk_command_parse_result parse_display_text(
@ -2472,7 +2469,7 @@ static enum stk_command_parse_result parse_display_text(
static void destroy_get_inkey(struct stk_command *command) static void destroy_get_inkey(struct stk_command *command)
{ {
g_free(command->get_inkey.text); l_free(command->get_inkey.text);
} }
static enum stk_command_parse_result parse_get_inkey( static enum stk_command_parse_result parse_get_inkey(
@ -2510,8 +2507,8 @@ static enum stk_command_parse_result parse_get_inkey(
static void destroy_get_input(struct stk_command *command) static void destroy_get_input(struct stk_command *command)
{ {
g_free(command->get_input.text); l_free(command->get_input.text);
g_free(command->get_input.default_text); l_free(command->get_input.default_text);
} }
static enum stk_command_parse_result parse_get_input( static enum stk_command_parse_result parse_get_input(
@ -2565,7 +2562,7 @@ static enum stk_command_parse_result parse_more_time(
static void destroy_play_tone(struct stk_command *command) static void destroy_play_tone(struct stk_command *command)
{ {
g_free(command->play_tone.alpha_id); l_free(command->play_tone.alpha_id);
} }
static enum stk_command_parse_result parse_play_tone( static enum stk_command_parse_result parse_play_tone(
@ -2622,7 +2619,7 @@ static enum stk_command_parse_result parse_poll_interval(
static void destroy_setup_menu(struct stk_command *command) static void destroy_setup_menu(struct stk_command *command)
{ {
g_free(command->setup_menu.alpha_id); l_free(command->setup_menu.alpha_id);
g_slist_free_full(command->setup_menu.items, destroy_stk_item); g_slist_free_full(command->setup_menu.items, destroy_stk_item);
} }
@ -2667,7 +2664,7 @@ static enum stk_command_parse_result parse_setup_menu(
static void destroy_select_item(struct stk_command *command) static void destroy_select_item(struct stk_command *command)
{ {
g_free(command->select_item.alpha_id); l_free(command->select_item.alpha_id);
g_slist_free_full(command->select_item.items, destroy_stk_item); g_slist_free_full(command->select_item.items, destroy_stk_item);
} }
@ -2718,7 +2715,7 @@ static enum stk_command_parse_result parse_select_item(
static void destroy_send_sms(struct stk_command *command) static void destroy_send_sms(struct stk_command *command)
{ {
g_free(command->send_sms.alpha_id); l_free(command->send_sms.alpha_id);
g_free(command->send_sms.cdma_sms.array); g_free(command->send_sms.cdma_sms.array);
} }
@ -2823,8 +2820,8 @@ out:
static void destroy_send_ss(struct stk_command *command) static void destroy_send_ss(struct stk_command *command)
{ {
g_free(command->send_ss.alpha_id);
g_free(command->send_ss.ss.ss); g_free(command->send_ss.ss.ss);
l_free(command->send_ss.alpha_id);
} }
static enum stk_command_parse_result parse_send_ss(struct stk_command *command, static enum stk_command_parse_result parse_send_ss(struct stk_command *command,
@ -2856,7 +2853,7 @@ static enum stk_command_parse_result parse_send_ss(struct stk_command *command,
static void destroy_send_ussd(struct stk_command *command) static void destroy_send_ussd(struct stk_command *command)
{ {
g_free(command->send_ussd.alpha_id); l_free(command->send_ussd.alpha_id);
} }
static enum stk_command_parse_result parse_send_ussd( static enum stk_command_parse_result parse_send_ussd(
@ -2889,9 +2886,9 @@ static enum stk_command_parse_result parse_send_ussd(
static void destroy_setup_call(struct stk_command *command) static void destroy_setup_call(struct stk_command *command)
{ {
g_free(command->setup_call.alpha_id_usr_cfm);
g_free(command->setup_call.addr.number); g_free(command->setup_call.addr.number);
g_free(command->setup_call.alpha_id_call_setup); l_free(command->setup_call.alpha_id_usr_cfm);
l_free(command->setup_call.alpha_id_call_setup);
} }
static enum stk_command_parse_result parse_setup_call( static enum stk_command_parse_result parse_setup_call(
@ -2944,7 +2941,7 @@ static enum stk_command_parse_result parse_setup_call(
static void destroy_refresh(struct stk_command *command) static void destroy_refresh(struct stk_command *command)
{ {
g_slist_free_full(command->refresh.file_list, g_free); g_slist_free_full(command->refresh.file_list, g_free);
g_free(command->refresh.alpha_id); l_free(command->refresh.alpha_id);
} }
static enum stk_command_parse_result parse_refresh( static enum stk_command_parse_result parse_refresh(
@ -3123,7 +3120,7 @@ static enum stk_command_parse_result parse_timer_mgmt(
static void destroy_setup_idle_mode_text(struct stk_command *command) static void destroy_setup_idle_mode_text(struct stk_command *command)
{ {
g_free(command->setup_idle_mode_text.text); l_free(command->setup_idle_mode_text.text);
} }
static enum stk_command_parse_result parse_setup_idle_mode_text( static enum stk_command_parse_result parse_setup_idle_mode_text(
@ -3160,8 +3157,8 @@ static enum stk_command_parse_result parse_setup_idle_mode_text(
static void destroy_run_at_command(struct stk_command *command) static void destroy_run_at_command(struct stk_command *command)
{ {
g_free(command->run_at_command.alpha_id);
g_free(command->run_at_command.at_command); g_free(command->run_at_command.at_command);
l_free(command->run_at_command.alpha_id);
} }
static enum stk_command_parse_result parse_run_at_command( static enum stk_command_parse_result parse_run_at_command(
@ -3199,8 +3196,8 @@ static enum stk_command_parse_result parse_run_at_command(
static void destroy_send_dtmf(struct stk_command *command) static void destroy_send_dtmf(struct stk_command *command)
{ {
g_free(command->send_dtmf.alpha_id);
g_free(command->send_dtmf.dtmf); g_free(command->send_dtmf.dtmf);
l_free(command->send_dtmf.alpha_id);
} }
static enum stk_command_parse_result parse_send_dtmf( static enum stk_command_parse_result parse_send_dtmf(
@ -3259,11 +3256,11 @@ static void destroy_launch_browser(struct stk_command *command)
g_free(command->launch_browser.url); g_free(command->launch_browser.url);
g_free(command->launch_browser.bearer.array); g_free(command->launch_browser.bearer.array);
g_slist_free_full(command->launch_browser.prov_file_refs, g_free); g_slist_free_full(command->launch_browser.prov_file_refs, g_free);
g_free(command->launch_browser.text_gateway_proxy_id);
g_free(command->launch_browser.alpha_id);
g_free(command->launch_browser.network_name.array); g_free(command->launch_browser.network_name.array);
g_free(command->launch_browser.text_usr); l_free(command->launch_browser.text_gateway_proxy_id);
g_free(command->launch_browser.text_passwd); l_free(command->launch_browser.alpha_id);
l_free(command->launch_browser.text_usr);
l_free(command->launch_browser.text_passwd);
} }
static enum stk_command_parse_result parse_launch_browser( static enum stk_command_parse_result parse_launch_browser(
@ -3315,10 +3312,10 @@ static enum stk_command_parse_result parse_launch_browser(
static void destroy_open_channel(struct stk_command *command) static void destroy_open_channel(struct stk_command *command)
{ {
g_free(command->open_channel.alpha_id);
g_free(command->open_channel.apn); g_free(command->open_channel.apn);
g_free(command->open_channel.text_usr); l_free(command->open_channel.alpha_id);
g_free(command->open_channel.text_passwd); l_free(command->open_channel.text_usr);
l_free(command->open_channel.text_passwd);
} }
static enum stk_command_parse_result parse_open_channel( static enum stk_command_parse_result parse_open_channel(
@ -3379,7 +3376,7 @@ static enum stk_command_parse_result parse_open_channel(
static void destroy_close_channel(struct stk_command *command) static void destroy_close_channel(struct stk_command *command)
{ {
g_free(command->close_channel.alpha_id); l_free(command->close_channel.alpha_id);
} }
static enum stk_command_parse_result parse_close_channel( static enum stk_command_parse_result parse_close_channel(
@ -3415,7 +3412,7 @@ static enum stk_command_parse_result parse_close_channel(
static void destroy_receive_data(struct stk_command *command) static void destroy_receive_data(struct stk_command *command)
{ {
g_free(command->receive_data.alpha_id); l_free(command->receive_data.alpha_id);
} }
static enum stk_command_parse_result parse_receive_data( static enum stk_command_parse_result parse_receive_data(
@ -3454,8 +3451,8 @@ static enum stk_command_parse_result parse_receive_data(
static void destroy_send_data(struct stk_command *command) static void destroy_send_data(struct stk_command *command)
{ {
g_free(command->send_data.alpha_id);
g_free(command->send_data.data.array); g_free(command->send_data.data.array);
l_free(command->send_data.alpha_id);
} }
static enum stk_command_parse_result parse_send_data( static enum stk_command_parse_result parse_send_data(
@ -3510,9 +3507,9 @@ static enum stk_command_parse_result parse_get_channel_status(
static void destroy_service_search(struct stk_command *command) static void destroy_service_search(struct stk_command *command)
{ {
g_free(command->service_search.alpha_id);
g_free(command->service_search.serv_search.ser_search); g_free(command->service_search.serv_search.ser_search);
g_free(command->service_search.dev_filter.dev_filter); g_free(command->service_search.dev_filter.dev_filter);
l_free(command->service_search.alpha_id);
} }
static enum stk_command_parse_result parse_service_search( static enum stk_command_parse_result parse_service_search(
@ -3547,8 +3544,8 @@ static enum stk_command_parse_result parse_service_search(
static void destroy_get_service_info(struct stk_command *command) static void destroy_get_service_info(struct stk_command *command)
{ {
g_free(command->get_service_info.alpha_id);
g_free(command->get_service_info.attr_info.attr_info); g_free(command->get_service_info.attr_info.attr_info);
l_free(command->get_service_info.alpha_id);
} }
static enum stk_command_parse_result parse_get_service_info( static enum stk_command_parse_result parse_get_service_info(
@ -3643,7 +3640,7 @@ static enum stk_command_parse_result parse_get_frames_status(
static void destroy_retrieve_mms(struct stk_command *command) static void destroy_retrieve_mms(struct stk_command *command)
{ {
g_free(command->retrieve_mms.alpha_id); l_free(command->retrieve_mms.alpha_id);
g_slist_free_full(command->retrieve_mms.mms_rec_files, g_free); g_slist_free_full(command->retrieve_mms.mms_rec_files, g_free);
} }
@ -3690,7 +3687,7 @@ static enum stk_command_parse_result parse_retrieve_mms(
static void destroy_submit_mms(struct stk_command *command) static void destroy_submit_mms(struct stk_command *command)
{ {
g_free(command->submit_mms.alpha_id); l_free(command->submit_mms.alpha_id);
g_slist_free_full(command->submit_mms.mms_subm_files, g_free); g_slist_free_full(command->submit_mms.mms_subm_files, g_free);
} }

View File

@ -2965,10 +2965,7 @@ char *convert_gsm_to_utf8_with_lang(const unsigned char *text, long len,
res_length += UTF8_LENGTH(c); res_length += UTF8_LENGTH(c);
} }
res = g_try_malloc(res_length + 1); res = l_malloc(res_length + 1);
if (res == NULL)
goto error;
out = res; out = res;
i = 0; i = 0;
@ -2983,7 +2980,7 @@ char *convert_gsm_to_utf8_with_lang(const unsigned char *text, long len,
} else } else
c = gsm_locking_shift_lookup(&t, text[i]); c = gsm_locking_shift_lookup(&t, text[i]);
out += g_unichar_to_utf8(c, out); out += l_utf8_from_wchar(c, out);
++i; ++i;
} }
@ -3567,9 +3564,7 @@ char *sim_string_to_utf8(const unsigned char *buffer, int length)
if (buffer[i] == 0xff && buffer[i + 1] == 0xff) if (buffer[i] == 0xff && buffer[i + 1] == 0xff)
break; break;
return g_convert((char *) buffer + 1, i - 1, return l_utf8_from_ucs2be(buffer + 1, i - 1);
"UTF-8//TRANSLIT", "UCS-2BE",
NULL, NULL, NULL);
case 0x81: case 0x81:
if (length < 3 || (buffer[1] > (length - 3))) if (length < 3 || (buffer[1] > (length - 3)))
return NULL; return NULL;
@ -3643,10 +3638,7 @@ char *sim_string_to_utf8(const unsigned char *buffer, int length)
if (buffer[i] != 0xff) if (buffer[i] != 0xff)
return NULL; return NULL;
utf8 = g_try_malloc(res_len + 1); utf8 = l_malloc(res_len + 1);
if (utf8 == NULL)
return NULL;
i = offset; i = offset;
out = utf8; out = utf8;
@ -3661,7 +3653,7 @@ char *sim_string_to_utf8(const unsigned char *buffer, int length)
} else } else
c = gsm_locking_shift_lookup(&t, buffer[i++]); c = gsm_locking_shift_lookup(&t, buffer[i++]);
out += g_unichar_to_utf8(c, out); out += l_utf8_from_wchar(c, out);
} }
*out = '\0'; *out = '\0';