Skip to content

Commit 31ca56e

Browse files
authored
fix: don't try to decode empty resource data in covenants (#458)
Fixes #457 Signed-off-by: Aurora Gaffney <aurora@blinklabs.io>
1 parent 3419ed5 commit 31ca56e

File tree

2 files changed

+19
-12
lines changed

2 files changed

+19
-12
lines changed

handshake/covenant.go

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -355,11 +355,13 @@ func NewRegisterCovenantFromGeneric(
355355
// Decode height from bytes
356356
ret.Height = binary.LittleEndian.Uint32(gc.Items[1])
357357
// Decode resource data
358-
tmpData, err := NewDomainResourceDataFromBytes(gc.Items[2])
359-
if err != nil {
360-
return nil, err
358+
if len(gc.Items[2]) > 0 {
359+
tmpData, err := NewDomainResourceDataFromBytes(gc.Items[2])
360+
if err != nil {
361+
return nil, err
362+
}
363+
ret.ResourceData = *tmpData
361364
}
362-
ret.ResourceData = *tmpData
363365
return ret, nil
364366
}
365367

@@ -391,11 +393,13 @@ func NewUpdateCovenantFromGeneric(
391393
// Decode height from bytes
392394
ret.Height = binary.LittleEndian.Uint32(gc.Items[1])
393395
// Decode resource data
394-
tmpData, err := NewDomainResourceDataFromBytes(gc.Items[2])
395-
if err != nil {
396-
return nil, err
396+
if len(gc.Items[2]) > 0 {
397+
tmpData, err := NewDomainResourceDataFromBytes(gc.Items[2])
398+
if err != nil {
399+
return nil, fmt.Errorf("decode domain resource data: %w", err)
400+
}
401+
ret.ResourceData = *tmpData
397402
}
398-
ret.ResourceData = *tmpData
399403
return ret, nil
400404
}
401405

handshake/domain.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,18 +70,19 @@ func (d *DomainResourceData) decode(data []byte) error {
7070
var err error
7171
// Version
7272
if err = binary.Read(r, binary.LittleEndian, &d.Version); err != nil {
73-
return err
73+
return fmt.Errorf("read version: %w", err)
7474
}
7575
// Records
7676
var recordType uint8
7777
var record DomainRecord
78+
recordLoop:
7879
for {
7980
// Read record type
8081
if err = binary.Read(r, binary.LittleEndian, &recordType); err != nil {
8182
if errors.Is(err, io.EOF) {
8283
break
8384
}
84-
return err
85+
return fmt.Errorf("read record type: %w", err)
8586
}
8687
switch recordType {
8788
case RecordTypeDS:
@@ -99,12 +100,14 @@ func (d *DomainResourceData) decode(data []byte) error {
99100
case RecordTypeTEXT:
100101
record = &TextDomainRecord{}
101102
default:
102-
return fmt.Errorf("unsupported record type %d", recordType)
103+
// Stop processing on unknown record type
104+
// This matches the behavior of hsd
105+
break recordLoop
103106
}
104107
if record != nil {
105108
err = record.decode(r)
106109
if err != nil {
107-
return err
110+
return fmt.Errorf("decode record: %w", err)
108111
}
109112
}
110113
d.Records = append(d.Records, record)

0 commit comments

Comments
 (0)