[Spice-devel] [cacard] simpletlv: Use GArray to make simpletlv_parse simpler
Christophe Fergeau
cfergeau at redhat.com
Mon Aug 13 09:08:29 UTC 2018
This allows to get rid of manual reallocations.
Signed-off-by: Christophe Fergeau <cfergeau at redhat.com>
---
src/simpletlv.c | 37 +++++++++++--------------------------
1 file changed, 11 insertions(+), 26 deletions(-)
diff --git a/src/simpletlv.c b/src/simpletlv.c
index 6759ea7..0adba5a 100644
--- a/src/simpletlv.c
+++ b/src/simpletlv.c
@@ -316,12 +316,14 @@ simpletlv_parse(unsigned char *data, size_t data_len, size_t *outtlv_len)
{
unsigned char *p, *p_end;
unsigned char tag;
- size_t vlen, tlv_len = 0, tlv_allocated = 0;
- struct simpletlv_member *tlv = NULL, *tlvp = NULL;
+ size_t vlen;
+ GArray *tlv = g_array_new(FALSE, FALSE, sizeof(struct simpletlv_member));
p = data;
p_end = p + data_len;
while (p < p_end) {
+ struct simpletlv_member tlvp;
+
/* we can return what was parsed successfully */
if (simpletlv_read_tag(&p, p_end - p, &tag, &vlen) < 0) {
break;
@@ -330,34 +332,17 @@ simpletlv_parse(unsigned char *data, size_t data_len, size_t *outtlv_len)
break;
}
- /* Extend the allocated structure if needed */
- if (tlv_len+1 > tlv_allocated) {
- struct simpletlv_member *newtlv;
- tlv_allocated += 10;
- newtlv = realloc(tlv, tlv_allocated * sizeof(struct simpletlv_member));
- if (newtlv == NULL) /* this is fatal */
- goto failure;
- tlv = newtlv;
- }
- tlvp = &(tlv[tlv_len++]);
- tlvp->value.value = NULL;
-
-
- tlvp->tag = tag;
- tlvp->length = vlen;
- tlvp->value.value = g_malloc(vlen);
- memcpy(tlvp->value.value, p, vlen);
- tlvp->type = SIMPLETLV_TYPE_LEAF;
+ tlvp.tag = tag;
+ tlvp.length = vlen;
+ tlvp.value.value = g_memdup(p, vlen);
+ tlvp.type = SIMPLETLV_TYPE_LEAF;
+ g_array_append_val(tlv, tlvp);
p += vlen;
}
- *outtlv_len = tlv_len;
- return tlv;
-
-failure:
- simpletlv_free(tlv, tlv_len);
- return NULL;
+ *outtlv_len = tlv->len;
+ return (struct simpletlv_member *)g_array_free(tlv, FALSE);
}
/* vim: set ts=4 sw=4 tw=0 noet expandtab: */
--
2.17.1
More information about the Spice-devel
mailing list