tlv_len = data2vp(ctx, packet, original, secret, child,
data + 2, data[1] - 2, data[1] - 2, tail);
if (tlv_len < 0) {
+ dict_attr_free(&child); /* only frees unknowns */
fr_pair_list_free(&head);
return -1;
}
attrlen - (dv->type + dv->length),
attrlen - (dv->type + dv->length),
pvp);
- if (my_len < 0) return my_len;
+ if (my_len < 0) {
+ dict_attr_free(&da); /* only frees unknowns */
+ return my_len;
+ }
return attrlen;
}
rcode = data2vp(ctx, packet, original, secret, child,
data, attrlen, attrlen, pvp);
- if (rcode < 0) return rcode;
+ if (rcode < 0) {
+ dict_attr_free(&child); /* only frees unknowns */
+ return rcode;
+ }
return attrlen;
}
rcode = data2vp(ctx, packet, original, secret, da,
data + 2, attrlen - 2, attrlen - 2,
pvp);
-
if ((rcode < 0) || (((size_t) rcode + 2) != attrlen)) goto raw; /* didn't decode all of the data */
return attrlen;
}
rcode = data2vp(ctx, packet, original, secret, child,
data, attrlen, attrlen, pvp);
- if (rcode < 0) return rcode;
+ if (rcode < 0) {
+ dict_attr_free(&child); /* only frees unknowns */
+ return rcode;
+ }
return attrlen;
}
/*
* This requires a whole lot more work.
*/
- return data2vp_extended(ctx, packet, original, secret, child,
- start, attrlen, packetlen, pvp);
+ rcode = data2vp_extended(ctx, packet, original, secret, child,
+ start, attrlen, packetlen, pvp);
+ if (rcode < 0) dict_attr_free(&child); /* only frees unknowns */
+ return rcode;
case PW_TYPE_EVS:
if (datalen < 6) goto raw; /* vid, vtype, value */
* information, decode the actual data.
*/
vp = fr_pair_afrom_da(ctx, da);
- if (!vp) return -1;
+ if (!vp) {
+ dict_attr_free(&da); /* only frees unknowns */
+ return -1;
+ }
alloc_raw:
vp->vp_length = datalen;
fail:
#endif
default:
+ dict_attr_free(&da); /* only frees unknowns */
fr_pair_list_free(&vp);
fr_strerror_printf("Internal sanity check %d", __LINE__);
return -1;
*/
rcode = data2vp(ctx, packet, original, secret, da,
data + 2, data[1] - 2, length - 2, pvp);
- if (rcode < 0) return rcode;
+ if (rcode < 0) {
+ dict_attr_free(&da); /* only frees unknowns */
+ return rcode;
+ }
return 2 + rcode;
}