about summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authorRobin Jarry <robin@jarry.cc>2021-10-28 14:59:54 +0200
committerRobin Jarry <robin@jarry.cc>2021-10-28 16:38:23 +0200
commit074b0a1bd8da38547c6e3eed9836149327012228 (patch)
tree0082759cd8b160c4e7513cb87a1bc600e9bb4f06 /lib
parentfc84b19bba0e0953ec06de27f1ec9c9f8d1a96ef (diff)
downloadaerc-074b0a1bd8da38547c6e3eed9836149327012228.tar.gz
view,list: fix crash when viewing incomplete imap messages
With IMAP, due to an unidentified reason, some messages to not have any
body accessible. When viewing them, aerc crashes:

  git.sr.ht/~sircmpwn/aerc/lib.usePGP
          lib/messageview.go:37
  git.sr.ht/~sircmpwn/aerc/lib.NewMessageStoreView
          lib/messageview.go:67
  git.sr.ht/~sircmpwn/aerc/commands/account.ViewMessage.Execute
          commands/account/view.go:45
  git.sr.ht/~sircmpwn/aerc/commands.(*Commands).ExecuteCommand
          commands/commands.go:66
  main.execCommand
          aerc.go:61
  main.main.func2
          aerc.go:160
  aerc crashed: runtime error: invalid memory address or nil pointer
  dereference

Check the pointer before dereferencing.

Also, add a global check in ParseMessageFormat where a similar issue may
occur.

Signed-off-by: Robin Jarry <robin@jarry.cc>
Diffstat (limited to 'lib')
-rw-r--r--lib/format/format.go52
-rw-r--r--lib/messageview.go3
2 files changed, 7 insertions, 48 deletions
diff --git a/lib/format/format.go b/lib/format/format.go
index 1639886..4ee62ac 100644
--- a/lib/format/format.go
+++ b/lib/format/format.go
@@ -58,6 +58,10 @@ func ParseMessageFormat(format string, timeFmt string, thisDayTimeFmt string,
 	}
 
 	envelope := ctx.MsgInfo.Envelope
+	if envelope == nil {
+		return "", nil,
+			errors.New("no envelope available for this message")
+	}
 
 	var c rune
 	for i, ni := 0, 0; i < len(format); {
@@ -105,10 +109,6 @@ func ParseMessageFormat(format string, timeFmt string, thisDayTimeFmt string,
 		case '%':
 			retval = append(retval, '%')
 		case 'a':
-			if envelope == nil {
-				return "", nil,
-					errors.New("no envelope available for this message")
-			}
 			if len(envelope.From) == 0 {
 				return "", nil,
 					errors.New("found no address for sender")
@@ -117,10 +117,6 @@ func ParseMessageFormat(format string, timeFmt string, thisDayTimeFmt string,
 			retval = append(retval, 's')
 			args = append(args, addr.Address)
 		case 'A':
-			if envelope == nil {
-				return "", nil,
-					errors.New("no envelope available for this message")
-			}
 			var addr *mail.Address
 			if len(envelope.ReplyTo) == 0 {
 				if len(envelope.From) == 0 {
@@ -156,10 +152,6 @@ func ParseMessageFormat(format string, timeFmt string, thisDayTimeFmt string,
 				dummyIfZeroDate(date.Local(),
 					timeFmt, thisDayTimeFmt, thisYearTimeFmt))
 		case 'f':
-			if envelope == nil {
-				return "", nil,
-					errors.New("no envelope available for this message")
-			}
 			if len(envelope.From) == 0 {
 				return "", nil,
 					errors.New("found no address for sender")
@@ -168,10 +160,6 @@ func ParseMessageFormat(format string, timeFmt string, thisDayTimeFmt string,
 			retval = append(retval, 's')
 			args = append(args, addr)
 		case 'F':
-			if envelope == nil {
-				return "", nil,
-					errors.New("no envelope available for this message")
-			}
 			if len(envelope.From) == 0 {
 				return "", nil,
 					errors.New("found no address for sender")
@@ -196,17 +184,9 @@ func ParseMessageFormat(format string, timeFmt string, thisDayTimeFmt string,
 			args = append(args, strings.Join(ctx.MsgInfo.Labels, ", "))
 
 		case 'i':
-			if envelope == nil {
-				return "", nil,
-					errors.New("no envelope available for this message")
-			}
 			retval = append(retval, 's')
 			args = append(args, envelope.MessageId)
 		case 'n':
-			if envelope == nil {
-				return "", nil,
-					errors.New("no envelope available for this message")
-			}
 			if len(envelope.From) == 0 {
 				return "", nil,
 					errors.New("found no address for sender")
@@ -221,33 +201,17 @@ func ParseMessageFormat(format string, timeFmt string, thisDayTimeFmt string,
 			retval = append(retval, 's')
 			args = append(args, val)
 		case 'r':
-			if envelope == nil {
-				return "", nil,
-					errors.New("no envelope available for this message")
-			}
 			addrs := FormatAddresses(envelope.To)
 			retval = append(retval, 's')
 			args = append(args, addrs)
 		case 'R':
-			if envelope == nil {
-				return "", nil,
-					errors.New("no envelope available for this message")
-			}
 			addrs := FormatAddresses(envelope.Cc)
 			retval = append(retval, 's')
 			args = append(args, addrs)
 		case 's':
-			if envelope == nil {
-				return "", nil,
-					errors.New("no envelope available for this message")
-			}
 			retval = append(retval, 's')
 			args = append(args, envelope.Subject)
 		case 't':
-			if envelope == nil {
-				return "", nil,
-					errors.New("no envelope available for this message")
-			}
 			if len(envelope.To) == 0 {
 				return "", nil,
 					errors.New("found no address for recipient")
@@ -259,10 +223,6 @@ func ParseMessageFormat(format string, timeFmt string, thisDayTimeFmt string,
 			retval = append(retval, 's')
 			args = append(args, ctx.AccountName)
 		case 'u':
-			if envelope == nil {
-				return "", nil,
-					errors.New("no envelope available for this message")
-			}
 			if len(envelope.From) == 0 {
 				return "", nil,
 					errors.New("found no address for sender")
@@ -275,10 +235,6 @@ func ParseMessageFormat(format string, timeFmt string, thisDayTimeFmt string,
 			retval = append(retval, 's')
 			args = append(args, mailbox)
 		case 'v':
-			if envelope == nil {
-				return "", nil,
-					errors.New("no envelope available for this message")
-			}
 			if len(envelope.From) == 0 {
 				return "", nil,
 					errors.New("found no address for sender")
diff --git a/lib/messageview.go b/lib/messageview.go
index 08ea92f..4f1d0cd 100644
--- a/lib/messageview.go
+++ b/lib/messageview.go
@@ -34,6 +34,9 @@ type MessageView interface {
 }
 
 func usePGP(info *models.BodyStructure) bool {
+	if info == nil {
+		return false
+	}
 	if info.MIMEType == "application" {
 		if info.MIMESubType == "pgp-encrypted" ||
 			info.MIMESubType == "pgp-signature" {
id='n401' href='#n401'>401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444