Hi Philippe, On 03/30/2011 04:41 PM, Philippe Nunes wrote: > --- > src/stkutil.c | 287 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- > src/stkutil.h | 132 ++++++++++++++++++++++----- > 2 files changed, 380 insertions(+), 39 deletions(-) > > @@ -1604,16 +1624,48 @@ static gboolean parse_dataobj_esn(struct comprehension_tlv_iter *iter, > static gboolean parse_dataobj_network_access_name( > struct comprehension_tlv_iter *iter, void *user) > { > - struct stk_network_access_name *nan = user; > + char **apn = user; > const unsigned char *data; > unsigned int len = comprehension_tlv_iter_get_length(iter); > + unsigned char label_size; > + unsigned char offset = 0; > + char decoded_apn[100]; > > - if (len == 0) > + if (len == 0 || len > 100) > return FALSE; > > data = comprehension_tlv_iter_get_data(iter); > - nan->len = len; > - memcpy(nan->name, data, len); > + /* > + * As specified in TS 23 003 Section 9 > + * The APN consists of one or more labels. Each label is coded as > + * a one octet length field followed by that number of octets coded > + * as 8 bit ASCII characters > + */ > + > + while (len) { > + label_size = *data; > + > + if (label_size > (len-1)) > + return FALSE; > + > + memcpy(decoded_apn + offset, data + 1, label_size); > + > + data += label_size + 1; > + offset += label_size; > + > + len -= label_size + 1; This really belongs with the data/offset increments > + if (len) { > + decoded_apn[offset] = '.'; > + offset += 1; This might be better written as: if (len > 0) decoded_apn[offset++] = '.'; > + } > + } > + > + *apn = g_try_malloc(offset + 1); > + if (*apn == NULL) > + return FALSE; > + > + memcpy(*apn, decoded_apn, offset); > + (*apn)[offset] = '\0'; *apn = g_strdup(decoded_apn); is really just fine ;) > > return TRUE; > } > @@ -3274,7 +3326,68 @@ static enum stk_command_parse_result parse_launch_browser( > STK_DATA_OBJECT_TYPE_INVALID); > } > > -/* TODO: parse_open_channel */ > +static void destroy_open_channel(struct stk_command *command) > +{ > + g_free(command->open_channel.alpha_id); > + g_free(command->open_channel.text_usr); > + g_free(command->open_channel.text_passwd); > +} ==9744== 40 bytes in 4 blocks are definitely lost in loss record 1,825 of 1,925 ==9744== at 0x4C274A8: malloc (vg_replace_malloc.c:236) ==9744== by 0x41B868: parse_dataobj_network_access_name (stkutil.c:1663) ==9744== by 0x41AF95: parse_dataobj (stkutil.c:2415) ==9744== by 0x41CC1B: stk_command_new_from_pdu (stkutil.c:3358) ==9744== by 0x40A953: test_open_channel (test-stkutil.c:17257) ==9744== by 0x4E922E2: g_test_run_suite_internal (gtestutils.c:1138) ==9744== by 0x4E92455: g_test_run_suite_internal (gtestutils.c:1197) ==9744== by 0x4E9273A: g_test_run_suite (gtestutils.c:1246) ==9744== by 0x406C45: main (test-stkutil.c:26130) > +static gboolean build_receive_data(struct stk_tlv_builder *builder, > + const struct stk_response *response) > +{ > + const struct stk_response_receive_data *receive_data = > + &response->receive_data; > + > + if (response->result.type == STK_RESULT_TYPE_SUCCESS) { > + if (receive_data->rx_data.len) { > + if (build_dataobj(builder, build_dataobj_channel_data, > + DATAOBJ_FLAG_CR, > + &response->receive_data.rx_data, > + NULL) != TRUE) > + return FALSE; > + } > + > + return build_dataobj(builder, > + build_dataobj_channel_data_length, > + DATAOBJ_FLAG_CR, > + &response->receive_data.rx_remaining, > + NULL); > + } Avoid nesting whenever possible. This really might be better written like: if (response->result.type != STK_RESULT_TYPE_SUCCESS) return TRUE; if (...) { } return build_dataobj(...) > + > + return TRUE; > +} > + > +static gboolean build_send_data(struct stk_tlv_builder *builder, > + const struct stk_response *response) > +{ > + if (response->result.type == STK_RESULT_TYPE_SUCCESS) { > + return build_dataobj(builder, > + build_dataobj_channel_data_length, > + DATAOBJ_FLAG_CR, > + &response->send_data.tx_avail, > + NULL); > + } > + Same comment as above > + return TRUE; > +} > + > const unsigned char *stk_pdu_from_response(const struct stk_response *response, > unsigned int *out_length) > { > +/* Defined in TS 102.223 Section 8.1 */ ^^^ This really doesn't sounds right for the Section > +enum stk_qualifier_send_data { > + STK_SEND_DATA_STORE_DATA = 0x00, > + STK_SEND_DATA_IMMEDIATELY = 0x01, > +}; > + > +/* Defined in TS 102.223 Section 8.56 */ > +enum stk_channel_status { > + STK_CHANNEL_PACKET_DATA_SERVICE_NOT_ACTIVATED = 0x00, > + STK_CHANNEL_PACKET_DATA_SERVICE_ACTIVATED = 0x01, > + STK_CHANNEL_TCP_IN_CLOSED_STATE = 0x02, > + STK_CHANNEL_TCP_IN_LISTEN_STATE = 0x03, > + STK_CHANNEL_TCP_IN_ESTABLISHED_STATE = 0x04, > + STK_CHANNEL_LINK_DROPPED = 0x05, > +}; > + You're playing serious magic here, but fair enough. Regards, -Denis