From 2125154397fbb1bea373abf4d2cead949c0e3f9b Mon Sep 17 00:00:00 2001 From: DualFroz Date: Wed, 2 Sep 2026 09:42:20 +0200 Subject: [PATCH] fix: avoid OverflowException when alignment width is int.MinValue Parsing a message template whose alignment is "-2147483648" (int.MinValue) threw System.OverflowException from Math.Abs, violating the documented contract that syntactically invalid templates yield text tokens rather than throwing. Treat that alignment as text, matching how other alignment values that cannot form a valid width are already handled. --- src/Serilog/Parsing/MessageTemplateParser.cs | 5 +++++ test/Serilog.Tests/Parsing/MessageTemplateParserTests.cs | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/src/Serilog/Parsing/MessageTemplateParser.cs b/src/Serilog/Parsing/MessageTemplateParser.cs index 81481a0..fa6f77f 100644 --- a/src/Serilog/Parsing/MessageTemplateParser.cs +++ b/src/Serilog/Parsing/MessageTemplateParser.cs @@ -150,6 +150,11 @@ public class MessageTemplateParser : IMessageTemplateParser if (!int.TryParse(alignment, NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out var width)) return new TextToken(rawText); + // A width of int.MinValue has no positive counterpart, so its magnitude cannot be + // represented as an alignment width; treat it as text rather than overflowing below. + if (width == int.MinValue) + return new TextToken(rawText); + var hasDash = alignment[0] == '-'; var direction = hasDash ? AlignmentDirection.Left : AlignmentDirection.Right; diff --git a/test/Serilog.Tests/Parsing/MessageTemplateParserTests.cs b/test/Serilog.Tests/Parsing/MessageTemplateParserTests.cs index f56fb60..ccf6b65 100644 --- a/test/Serilog.Tests/Parsing/MessageTemplateParserTests.cs +++ b/test/Serilog.Tests/Parsing/MessageTemplateParserTests.cs @@ -379,6 +379,13 @@ public class MessageTemplateParserTests new TextToken("{Hello,10-1}")); } + [Fact] + public void AlignmentOfIntMinValueIsParsedAsText() + { + AssertParsedAs("{Hello,-2147483648}", + new TextToken("{Hello,-2147483648}")); + } + [Fact] public void EmptyAlignmentIsParsedAsText() {