From 89d2c0986b7f3bb0c477a0b658bfe96f62201b3e Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Fri, 27 Mar 2026 10:27:06 +0100 Subject: [PATCH 1/3] add all attachments --- src/Sentry/Protocol/Envelopes/Envelope.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Sentry/Protocol/Envelopes/Envelope.cs b/src/Sentry/Protocol/Envelopes/Envelope.cs index e3e85da713..3dfc5b6200 100644 --- a/src/Sentry/Protocol/Envelopes/Envelope.cs +++ b/src/Sentry/Protocol/Envelopes/Envelope.cs @@ -313,13 +313,10 @@ public static Envelope FromFeedback( if (attachments is { Count: > 0 }) { - if (attachments.Count > 1) + foreach (var attachment in attachments) { - logger?.LogWarning("Feedback can only contain one attachment. Discarding {0} additional attachments.", - attachments.Count - 1); + AddEnvelopeItemFromAttachment(items, attachment, logger); } - - AddEnvelopeItemFromAttachment(items, attachments.First(), logger); } if (sessionUpdate is not null) From 013cf7fa4d6f79c3451972c3f6d13468fbc21518 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Fri, 27 Mar 2026 10:48:13 +0100 Subject: [PATCH 2/3] updated test --- .../Protocol/Envelopes/EnvelopeTests.cs | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/test/Sentry.Tests/Protocol/Envelopes/EnvelopeTests.cs b/test/Sentry.Tests/Protocol/Envelopes/EnvelopeTests.cs index 8db1187afe..fe464496fa 100644 --- a/test/Sentry.Tests/Protocol/Envelopes/EnvelopeTests.cs +++ b/test/Sentry.Tests/Protocol/Envelopes/EnvelopeTests.cs @@ -845,7 +845,7 @@ public void FromFeedback_NoFeedbackContext_Throws() } [Fact] - public void FromFeedback_MultipleAttachments_LogsWarning() + public void FromFeedback_MultipleAttachments_AddsAll() { // Arrange var feedback = new SentryFeedback( @@ -864,23 +864,15 @@ public void FromFeedback_MultipleAttachments_LogsWarning() Feedback = feedback } }; - var logger = Substitute.For(); - logger.IsEnabled(Arg.Any()).Returns(true); - List attachments = [ AttachmentHelper.FakeAttachment("file1.txt"), AttachmentHelper.FakeAttachment("file2.txt") ]; // Act - using var envelope = Envelope.FromFeedback(evt, logger, attachments); + using var envelope = Envelope.FromFeedback(evt, attachments: attachments); // Assert - logger.Received(1).Log( - SentryLevel.Warning, - Arg.Is(m => m.Contains("Feedback can only contain one attachment")), - null, - Arg.Any()); - envelope.Items.Should().ContainSingle(item => item.TryGetType() == EnvelopeItem.TypeValueAttachment); + envelope.Items.Count(item => item.TryGetType() == EnvelopeItem.TypeValueAttachment).Should().Be(2); } [Fact] From 8a2c0fb214e5c1b462c3585d83f47806defc0ed8 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Fri, 27 Mar 2026 11:27:02 +0100 Subject: [PATCH 3/3] feedback --- src/Sentry/Protocol/Envelopes/Envelope.cs | 7 +++++ .../Protocol/Envelopes/EnvelopeTests.cs | 31 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/Sentry/Protocol/Envelopes/Envelope.cs b/src/Sentry/Protocol/Envelopes/Envelope.cs index 3dfc5b6200..227c572797 100644 --- a/src/Sentry/Protocol/Envelopes/Envelope.cs +++ b/src/Sentry/Protocol/Envelopes/Envelope.cs @@ -315,6 +315,13 @@ public static Envelope FromFeedback( { foreach (var attachment in attachments) { + // Safety check, in case the user forcefully added a null attachment. + if (attachment.IsNull()) + { + logger?.LogWarning("Encountered a null attachment. Skipping."); + continue; + } + AddEnvelopeItemFromAttachment(items, attachment, logger); } } diff --git a/test/Sentry.Tests/Protocol/Envelopes/EnvelopeTests.cs b/test/Sentry.Tests/Protocol/Envelopes/EnvelopeTests.cs index fe464496fa..1835016cf9 100644 --- a/test/Sentry.Tests/Protocol/Envelopes/EnvelopeTests.cs +++ b/test/Sentry.Tests/Protocol/Envelopes/EnvelopeTests.cs @@ -875,6 +875,37 @@ public void FromFeedback_MultipleAttachments_AddsAll() envelope.Items.Count(item => item.TryGetType() == EnvelopeItem.TypeValueAttachment).Should().Be(2); } + [Fact] + public void FromFeedback_NullAttachment_Skipped() + { + // Arrange + var feedback = new SentryFeedback( + "Everything is great!", + "foo@bar.com", + "Someone Nice", + "fake-replay-id", + "https://www.example.com", + SentryId.Create() + ); + var evt = new SentryEvent + { + Level = SentryLevel.Info, + Contexts = + { + Feedback = feedback + } + }; + List attachments = [ + null!, AttachmentHelper.FakeAttachment("file1.txt") + ]; + + // Act + using var envelope = Envelope.FromFeedback(evt, attachments: attachments); + + // Assert + envelope.Items.Count(item => item.TryGetType() == EnvelopeItem.TypeValueAttachment).Should().Be(1); + } + [Fact] public async Task Roundtrip_WithSession_Success() {