From f38fa38bff41215a12606ea12088db6189eb9e82 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Thu, 5 Mar 2026 20:57:47 +0900 Subject: [PATCH] fix: prevent file descriptor leak in discord SendMedia Replace duplicated file cleanup code in select branches with a single defer, ensuring files are always closed even on unexpected panics. --- pkg/channels/discord/discord.go | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/pkg/channels/discord/discord.go b/pkg/channels/discord/discord.go index 1de910c83..f2a4baf53 100644 --- a/pkg/channels/discord/discord.go +++ b/pkg/channels/discord/discord.go @@ -190,6 +190,15 @@ func (c *DiscordChannel) SendMedia(ctx context.Context, msg bus.OutboundMediaMes return nil } + // Ensure all opened files are closed when done + defer func() { + for _, f := range files { + if closer, ok := f.Reader.(*os.File); ok { + closer.Close() + } + } + }() + sendCtx, cancel := context.WithTimeout(ctx, sendTimeout) defer cancel() @@ -204,23 +213,11 @@ func (c *DiscordChannel) SendMedia(ctx context.Context, msg bus.OutboundMediaMes select { case err := <-done: - // Close all file readers - for _, f := range files { - if closer, ok := f.Reader.(*os.File); ok { - closer.Close() - } - } if err != nil { return fmt.Errorf("discord send media: %w", channels.ErrTemporary) } return nil case <-sendCtx.Done(): - // Close all file readers - for _, f := range files { - if closer, ok := f.Reader.(*os.File); ok { - closer.Close() - } - } return sendCtx.Err() } }