From e5963edae50c8797ac1cf38c20e1cc658e1ca33c Mon Sep 17 00:00:00 2001 From: Georg Reinke Date: Sat, 9 Nov 2024 15:04:20 +0100 Subject: [PATCH] conn: generate error reply in more cases when trying to send invalid message Fixes #396. --- conn.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/conn.go b/conn.go index bbe111b..af6be85 100644 --- a/conn.go +++ b/conn.go @@ -3,6 +3,7 @@ package dbus import ( "context" "errors" + "fmt" "io" "os" "strings" @@ -500,15 +501,26 @@ func (conn *Conn) sendMessageAndIfClosed(msg *Message, ifClosed func()) error { return err } +func isEncodingError(err error) bool { + switch err.(type) { + case FormatError: + return true + case InvalidMessageError: + return true + } + return false +} + func (conn *Conn) handleSendError(msg *Message, err error) { if msg.Type == TypeMethodCall { conn.calls.handleSendError(msg, err) } else if msg.Type == TypeMethodReply { - if _, ok := err.(FormatError); ok { + if isEncodingError(err) { // Make sure that the caller gets some kind of error response if // the application code tried to respond, but the resulting message // was malformed in the end - conn.sendError(err, msg.Headers[FieldDestination].value.(string), msg.Headers[FieldReplySerial].value.(uint32)) + returnedErr := fmt.Errorf("destination tried to respond with invalid message (%w)", err) + conn.sendError(returnedErr, msg.Headers[FieldDestination].value.(string), msg.Headers[FieldReplySerial].value.(uint32)) } } conn.serialGen.RetireSerial(msg.serial)