From 14aeb3f7c78e2a981718de8c8448750eddfb5f50 Mon Sep 17 00:00:00 2001 From: Ildar Khayrutdinov Date: Sun, 13 Apr 2025 20:14:30 +0300 Subject: [PATCH] limit for iteration & bufSz --- .../Metadata/Profiles/Exif/ExifReader.cs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/ImageSharp/Metadata/Profiles/Exif/ExifReader.cs b/src/ImageSharp/Metadata/Profiles/Exif/ExifReader.cs index 1c8cf227c0..3af4eb3c39 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/ExifReader.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/ExifReader.cs @@ -7,6 +7,7 @@ using System.Collections.ObjectModel; using System.Diagnostics; using System.Globalization; using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using System.Text; using SixLabors.ImageSharp.Memory; @@ -187,18 +188,22 @@ internal abstract class BaseExifReader protected void ReadSubIfd(List values) { - if (this.subIfds is not null) + if (this.subIfds != null) { - do + const int maxSubIfds = 8; + const int maxNestingLevel = 8; + Span buf = stackalloc ulong[maxSubIfds]; + for (int i = 0; i < maxNestingLevel && this.subIfds.Count > 0; i++) { - ulong[] buf = [.. this.subIfds]; + int sz = Math.Min(this.subIfds.Count, maxSubIfds); + CollectionsMarshal.AsSpan(this.subIfds)[..sz].CopyTo(buf); + this.subIfds.Clear(); - foreach (ulong subIfdOffset in buf) + foreach (ulong subIfdOffset in buf[..sz]) { this.ReadValues(values, (uint)subIfdOffset); } } - while (this.subIfds.Count > 0); } }