diff --git a/common/onion.c b/common/onion.c index 91ede1cf7..b9e8aa0a1 100644 --- a/common/onion.c +++ b/common/onion.c @@ -243,9 +243,11 @@ struct onion_payload *onion_decode(const tal_t *ctx, case ONION_TLV_PAYLOAD: tlv = tlv_tlv_payload_new(p); if (!fromwire_tlv_payload(&cursor, &max, tlv)) - return tal_free(p); - if (!tlv_payload_is_valid(tlv, NULL)) - return tal_free(p); + goto fail; + + if (!tlv_payload_is_valid(tlv, failtlvpos)) + goto fail; + /* BOLT #4: * @@ -254,7 +256,7 @@ struct onion_payload *onion_decode(const tal_t *ctx, * `outgoing_cltv_value` are not present. */ if (!tlv->amt_to_forward || !tlv->outgoing_cltv_value) - return tal_free(p); + goto fail; amount_msat_from_u64(&p->amt_to_forward, tlv->amt_to_forward->amt_to_forward); @@ -269,7 +271,7 @@ struct onion_payload *onion_decode(const tal_t *ctx, */ if (rs->nextcase == ONION_FORWARD) { if (!tlv->short_channel_id) - return tal_free(p); + goto fail; p->forward_channel = tal(p, struct short_channel_id); *p->forward_channel = tlv->short_channel_id->short_channel_id; @@ -300,4 +302,8 @@ struct onion_payload *onion_decode(const tal_t *ctx, /* You said it was a valid type! */ abort(); +fail: + tal_free(tlv); + tal_free(p); + return NULL; }