asn1: Fix leaks in template printing
This commit is contained in:
@@ -2353,7 +2353,6 @@ _asn1_print_open_type(const struct asn1_template *t, /* object set template */
|
|||||||
const void * const *val;
|
const void * const *val;
|
||||||
const int *elementp = DPOC(data, t->offset); /* Choice enum pointer */
|
const int *elementp = DPOC(data, t->offset); /* Choice enum pointer */
|
||||||
char *indents = getindent(flags, indent);
|
char *indents = getindent(flags, indent);
|
||||||
char *s;
|
|
||||||
|
|
||||||
/* XXX We assume sizeof(enum) == sizeof(int) */
|
/* XXX We assume sizeof(enum) == sizeof(int) */
|
||||||
if (!*elementp || *elementp >= A1_HEADER_LEN(tos) + 1) {
|
if (!*elementp || *elementp >= A1_HEADER_LEN(tos) + 1) {
|
||||||
@@ -2378,16 +2377,17 @@ _asn1_print_open_type(const struct asn1_template *t, /* object set template */
|
|||||||
dp = (void *)(((char *)dp) + sizeof(*elementp));
|
dp = (void *)(((char *)dp) + sizeof(*elementp));
|
||||||
if (*dp) {
|
if (*dp) {
|
||||||
struct rk_strpool *r2 = NULL;
|
struct rk_strpool *r2 = NULL;
|
||||||
|
char *s = NULL;
|
||||||
|
|
||||||
r2 = _asn1_print(tactual_type, r2, flags, indent + 1, *dp, NULL);
|
r2 = _asn1_print(tactual_type, r2, flags, indent + 1, *dp, NULL);
|
||||||
if (r2 == NULL) {
|
if (r2 == NULL) {
|
||||||
r = rk_strpoolprintf(r,
|
r = rk_strpoolprintf(r, ",%s\"_%s\":\"_ERROR_FORMATTING_\"",
|
||||||
",%s\"_%s\":\"_ERROR_FORMATTING_\"",
|
|
||||||
indents ? indents : "", opentype_name);
|
indents ? indents : "", opentype_name);
|
||||||
free(indents);
|
free(indents);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
s = rk_strpoolcollect(r2);
|
s = rk_strpoolcollect(r2);
|
||||||
|
if (s)
|
||||||
r = rk_strpoolprintf(r, ",%s\"_%s\":%s",
|
r = rk_strpoolprintf(r, ",%s\"_%s\":%s",
|
||||||
indents ? indents : "", opentype_name, s);
|
indents ? indents : "", opentype_name, s);
|
||||||
free(indents);
|
free(indents);
|
||||||
@@ -2412,10 +2412,15 @@ _asn1_print_open_type(const struct asn1_template *t, /* object set template */
|
|||||||
r = rk_strpoolprintf(r, "%s", indents ? indents : "");
|
r = rk_strpoolprintf(r, "%s", indents ? indents : "");
|
||||||
for (i = 0; r && i < len; i++) {
|
for (i = 0; r && i < len; i++) {
|
||||||
struct rk_strpool *r2 = NULL;
|
struct rk_strpool *r2 = NULL;
|
||||||
|
char *s = NULL;;
|
||||||
|
|
||||||
if (val[i]) {
|
if (val[i]) {
|
||||||
r2 = _asn1_print(tactual_type, r2, flags, indent + 2, val[i], NULL);
|
r2 = _asn1_print(tactual_type, r2, flags, indent + 2, val[i], NULL);
|
||||||
if (r2 == NULL)
|
if (r2 == NULL) {
|
||||||
continue;
|
rk_strpoolfree(r);
|
||||||
|
free(indents);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (i)
|
if (i)
|
||||||
r = rk_strpoolprintf(r, ",%s", indents ? indents : "");
|
r = rk_strpoolprintf(r, ",%s", indents ? indents : "");
|
||||||
@@ -2423,6 +2428,7 @@ _asn1_print_open_type(const struct asn1_template *t, /* object set template */
|
|||||||
r = rk_strpoolprintf(r, "%s", (s = rk_strpoolcollect(r2)));
|
r = rk_strpoolprintf(r, "%s", (s = rk_strpoolcollect(r2)));
|
||||||
free(s);
|
free(s);
|
||||||
}
|
}
|
||||||
|
free(indents);
|
||||||
return rk_strpoolprintf(r, "]");
|
return rk_strpoolprintf(r, "]");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2467,7 +2473,7 @@ _asn1_print(const struct asn1_template *t,
|
|||||||
saved = data;
|
saved = data;
|
||||||
|
|
||||||
t = tbase + 1;
|
t = tbase + 1;
|
||||||
while (elements && (t->tt & A1_OP_MASK) != A1_OP_NAME) {
|
while (r && elements && (t->tt & A1_OP_MASK) != A1_OP_NAME) {
|
||||||
switch (t->tt & A1_OP_MASK) {
|
switch (t->tt & A1_OP_MASK) {
|
||||||
case A1_OP_NAME:
|
case A1_OP_NAME:
|
||||||
continue;
|
continue;
|
||||||
|
Reference in New Issue
Block a user