Hi Yang,

> @@ -281,8 +281,9 @@ static gboolean parse_dataobj_alpha_id(struct
>  comprehension_tlv_iter *iter, char *utf8;
> 
>       len = comprehension_tlv_iter_get_length(iter);
> -     if (len < 1)
> -             return FALSE;
> +
> +     if (len == 0)
> +             return TRUE;
> 
>       data = comprehension_tlv_iter_get_data(iter);
>       utf8 = sim_string_to_utf8(data, len);

There is no mention that the Alpha identifier can be present and empty, so 
returning TRUE on a len 0 is not actually correct.  The only exception so far 
seems to be text string which explicitly allows NULL strings.

> @@ -373,8 +374,10 @@ static gboolean parse_dataobj_item(struct
>  comprehension_tlv_iter *iter, char *utf8;
> 
>       len = comprehension_tlv_iter_get_length(iter);
> -     if (len < 2)
> -             return FALSE;
> +
> +     if (len == 0)
> +             return TRUE;
> +
> 

Same with this one...

>       data = comprehension_tlv_iter_get_data(iter);
> 
> @@ -2006,6 +2009,7 @@ static gboolean parse_dataobj(struct
>  comprehension_tlv_iter *iter, GSList *l;
>       va_list args;
>       gboolean minimum_set = TRUE;
> +     GSList **list = NULL;
> 
>       va_start(args, type);
> 
> @@ -2022,29 +2026,74 @@ static gboolean parse_dataobj(struct
>  comprehension_tlv_iter *iter, entries = g_slist_prepend(entries, entry);
>       }
> 
> -
>       if (comprehension_tlv_iter_next(iter) != TRUE)
>               goto out;
> 
>       entries = g_slist_reverse(entries);
> 
> -     for (l = entries; l; l = l->next) {
> +     for (l = entries; l;) {
>               dataobj_handler handler;
>               struct dataobj_handler_entry *entry = l->data;
> +             unsigned short tag;
> +             gboolean ret;
> +             void *dataobj;
> 
>               handler = handler_for_type(entry->type);
> -             if (handler == NULL)
> +             if (handler == NULL) {
> +                     l = l->next;
>                       continue;
> +             }
> 
> -             if (comprehension_tlv_iter_get_tag(iter) == entry->type) {
> -                     if (handler(iter, entry->data))
> -                             entry->parsed = TRUE;
> -                     if (comprehension_tlv_iter_next(iter) == FALSE)
> -                             break;
> +             tag = comprehension_tlv_iter_get_tag(iter);
> +             if (tag != entry->type) {
> +                     l = l->next;
> +                     continue;
>               }
> +
> +             if (tag == STK_DATA_OBJECT_TYPE_PROVISIONING_FILE_REFERENCE ||
> +                     tag == STK_DATA_OBJECT_TYPE_ITEM) {
> +
> +                     if (tag == STK_DATA_OBJECT_TYPE_ITEM)
> +                             dataobj = g_try_new0(struct stk_item, 1);
> +                     else
> +                             dataobj = g_try_new0(struct stk_file, 1);
> +
> +                     if (!dataobj)
> +                             goto out;
> +
> +                     if (!list)
> +                             list = entry->data;
> +
> +                     ret = handler(iter, dataobj);
> +             } else
> +                     ret = handler(iter, entry->data);
> +
> +             if (ret)
> +                     entry->parsed = TRUE;
> +
> +             if (tag == STK_DATA_OBJECT_TYPE_PROVISIONING_FILE_REFERENCE ||
> +                     tag == STK_DATA_OBJECT_TYPE_ITEM) {
> +
> +                     if (tag == STK_DATA_OBJECT_TYPE_ITEM) {
> +                             struct stk_item *item = dataobj;
> +                             /* either return is FALSE or item is empty */
> +                             if (item->id == 0)
> +                                     g_free(item);
> +                             else
> +                                     *list = g_slist_prepend(*list, item);
> +                     } else
> +                             *list = g_slist_prepend(*list, dataobj);
> +             } else
> +                     l = l->next;
> +
> +             if (comprehension_tlv_iter_next(iter) == FALSE)
> +                     break;
>       }
> 

I really don't like this.  I understand why you're doing it this way, but lets 
try to make this more elegant.  Either add another FLAG saying that the items 
are actually in a list, or parse the item list separately.

e.g. 

parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID,
                        DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
                        &obj->alpha_id,
                        STK_DATA_OBJECT_TYPE_ITEM,
                        DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM | 
DATAOBJ_FLAG_LIST,
                        &obj->items, ...

or

/* Parse only until item list */
parse_dataobj(iter, STK_DATA_OBJECT_TYPE_ALPHA_ID,
                        DATAOBJ_FLAG_MANDATORY | DATAOBJ_FLAG_MINIMUM,
                        &obj->alpha_id,
                        STK_DATA_OBJECT_TYPE_ITEM,
                        STK_DATA_OBJECT_TYPE_INVALID);

/* Manually parse item list */
...

/* Parse rest */
...

Regards,
-Denis
_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono

Reply via email to