htlcswitch/link: return InvalidOnionPayload failure

This commit modifies the link return an InvalidOnionPayload failure when
it cannot parse a TLV payload. The offset is left at zero, since its
unclear how useful it will be in practice and would require some
significant reworkings of the abstractions in the tlv package.

TODO: add unit tests. currently none of the test unit infrastructure is
setup to handle TLV payloads, so this would require implementing a
separate mock iterator for TLV payloads that also supports injecting
invalid payloads. Deferring this non-trival effor till a later date
This commit is contained in:
Conner Fromknecht 2019-10-30 21:19:53 -07:00
parent 0fc506e044
commit 3455f7965d
No known key found for this signature in database
GPG key ID: E7D737B67FA592C7

View file

@ -2646,12 +2646,23 @@ func (l *channelLink) processRemoteAdds(fwdPkg *channeldb.FwdPkg,
fwdInfo, err := chanIterator.ForwardingInstructions() fwdInfo, err := chanIterator.ForwardingInstructions()
if err != nil { if err != nil {
// If we're unable to process the onion payload, or we // If we're unable to process the onion payload, or we
// we received malformed TLV stream, then we should // received invalid onion payload failure, then we
// send an error back to the caller so the HTLC can be // should send an error back to the caller so the HTLC
// canceled. // can be canceled.
var failedType uint64
if e, ok := err.(hop.ErrInvalidPayload); ok {
failedType = uint64(e.Type)
}
// TODO: currently none of the test unit infrastructure
// is setup to handle TLV payloads, so testing this
// would require implementing a separate mock iterator
// for TLV payloads that also supports injecting invalid
// payloads. Deferring this non-trival effort till a
// later date
l.sendHTLCError( l.sendHTLCError(
pd.HtlcIndex, pd.HtlcIndex,
lnwire.NewInvalidOnionVersion(onionBlob[:]), lnwire.NewInvalidOnionPayload(failedType, 0),
obfuscator, pd.SourceRef, obfuscator, pd.SourceRef,
) )
needUpdate = true needUpdate = true