mirror of git://git.sysmocom.de/ofono
mbim: Parse variable sized item arrays
This commit is contained in:
parent
bbb9f33253
commit
a64b5453e8
|
@ -191,6 +191,9 @@ static bool _iter_next_entry_basic(struct mbim_message_iter *iter,
|
||||||
const void *data;
|
const void *data;
|
||||||
size_t pos;
|
size_t pos;
|
||||||
|
|
||||||
|
if (iter->container_type == CONTAINER_TYPE_ARRAY && !iter->n_elem)
|
||||||
|
return false;
|
||||||
|
|
||||||
if (iter->pos >= iter->len)
|
if (iter->pos >= iter->len)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -250,6 +253,42 @@ static bool _iter_next_entry_basic(struct mbim_message_iter *iter,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool _iter_enter_array(struct mbim_message_iter *iter,
|
||||||
|
struct mbim_message_iter *array)
|
||||||
|
{
|
||||||
|
size_t pos;
|
||||||
|
uint32_t n_elem;
|
||||||
|
const char *sig_start;
|
||||||
|
const char *sig_end;
|
||||||
|
const void *data;
|
||||||
|
|
||||||
|
if (iter->sig_start[iter->sig_pos] != 'a')
|
||||||
|
return false;
|
||||||
|
|
||||||
|
sig_start = iter->sig_start + iter->sig_pos + 1;
|
||||||
|
sig_end = _signature_end(sig_start) + 1;
|
||||||
|
|
||||||
|
pos = align_len(iter->pos, 4);
|
||||||
|
if (pos + 4 > iter->len)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
data = _iter_get_data(iter, pos);
|
||||||
|
n_elem = l_get_le32(data);
|
||||||
|
pos += 4;
|
||||||
|
|
||||||
|
_iter_init_internal(array, CONTAINER_TYPE_ARRAY, sig_start, sig_end,
|
||||||
|
iter->iov, iter->n_iov,
|
||||||
|
iter->len, iter->base_offset,
|
||||||
|
pos, n_elem);
|
||||||
|
|
||||||
|
if (iter->container_type != CONTAINER_TYPE_ARRAY)
|
||||||
|
iter->sig_pos += sig_end - sig_start + 1;
|
||||||
|
|
||||||
|
iter->pos = pos + 8 * n_elem;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static bool message_iter_next_entry_valist(struct mbim_message_iter *orig,
|
static bool message_iter_next_entry_valist(struct mbim_message_iter *orig,
|
||||||
va_list args)
|
va_list args)
|
||||||
{
|
{
|
||||||
|
@ -257,6 +296,8 @@ static bool message_iter_next_entry_valist(struct mbim_message_iter *orig,
|
||||||
struct mbim_message_iter *iter = orig;
|
struct mbim_message_iter *iter = orig;
|
||||||
const char *signature = orig->sig_start + orig->sig_pos;
|
const char *signature = orig->sig_start + orig->sig_pos;
|
||||||
const char *end;
|
const char *end;
|
||||||
|
uint32_t *out_n_elem;
|
||||||
|
struct mbim_message_iter *sub_iter;
|
||||||
void *arg;
|
void *arg;
|
||||||
|
|
||||||
while (signature < orig->sig_start + orig->sig_len) {
|
while (signature < orig->sig_start + orig->sig_len) {
|
||||||
|
@ -300,11 +341,26 @@ static bool message_iter_next_entry_valist(struct mbim_message_iter *orig,
|
||||||
signature = end + 1;
|
signature = end + 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 'a':
|
||||||
|
out_n_elem = va_arg(args, uint32_t *);
|
||||||
|
sub_iter = va_arg(args, void *);
|
||||||
|
|
||||||
|
if (!_iter_enter_array(iter, sub_iter))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
*out_n_elem = sub_iter->n_elem;
|
||||||
|
|
||||||
|
end = _signature_end(signature + 1);
|
||||||
|
signature = end + 1;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (iter->container_type == CONTAINER_TYPE_ARRAY)
|
||||||
|
iter->n_elem -= 1;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue