From 4dbf1b6f64ebde834df71829e81edf168a875083 Mon Sep 17 00:00:00 2001 From: Josh Deprez Date: Sun, 16 Jun 2024 13:08:53 +1000 Subject: [PATCH] Another strict size workaround --- router/port.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/router/port.go b/router/port.go index 760e013..e6c05bb 100644 --- a/router/port.go +++ b/router/port.go @@ -18,6 +18,7 @@ package router import ( "context" + "encoding/binary" "errors" "io" "log" @@ -79,8 +80,18 @@ func (port *EtherTalkPort) Serve(ctx context.Context) { case ethertalk.AppleTalkProto: // log.Print("Got an AppleTalk frame") + + // Workaround for strict length checking in sfiera/multitalk + payload := ethFrame.Payload + if len(payload) < 2 { + log.Printf("Couldn't unmarshal DDP packet: too small (length = %d)", len(payload)) + } + if size := binary.BigEndian.Uint16(payload[:2]) & 0x3ff; len(payload) > int(size) { + payload = payload[:size] + } + ddpkt := new(ddp.ExtPacket) - if err := ddp.ExtUnmarshal(ethFrame.Payload, ddpkt); err != nil { + if err := ddp.ExtUnmarshal(payload, ddpkt); err != nil { log.Printf("Couldn't unmarshal DDP packet: %v", err) continue }