dotnet/wpf · error · ArgumentOutOfRangeException

SR.SeekOriginInvalid

Error message

SR.SeekOriginInvalid

What it means

CompressEmulationStream.Seek validates the SeekOrigin. Only Begin, Current, and End are accepted; any other value (invalid cast, uninitialized enum) reaches the default branch and throws ArgumentOutOfRangeException with SR.SeekOriginInvalid.

Solutions

  1. Pass only SeekOrigin.Begin, SeekOrigin.Current, or SeekOrigin.End.
  2. Validate/normalize the origin enum before calling Seek on wrapped streams.
  3. Fix code that computes origin from an int without range checking.

Example fix

// before
emulationStream.Seek(offset, (SeekOrigin)rawValue);
// after
if (rawValue < 0 || rawValue > (int)SeekOrigin.End)
    throw new ArgumentOutOfRangeException(nameof(rawValue));
emulationStream.Seek(offset, (SeekOrigin)rawValue);
Defensive patterns

Strategy: validation

Validate before calling

bool IsValidSeekOrigin(SeekOrigin origin) =>
    origin is SeekOrigin.Begin or SeekOrigin.Current or SeekOrigin.End;

Type guard

bool IsDefinedSeekOrigin(SeekOrigin o) => o >= SeekOrigin.Begin && o <= SeekOrigin.End;

Try / catch

try { es.Seek(offset, origin); }
catch (ArgumentOutOfRangeException) { reportInvalidOrigin(origin); }

Prevention

When it happens

Trigger: Calling Seek(offset, origin) with an out-of-range SeekOrigin value, e.g. (SeekOrigin)42 from an unvalidated caller or computed enum value, via Position or directly.

Common situations: Generic stream-wrapper code that passes user- or config-supplied origin values through without validation; deserialized enum values from older data.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


AI-assisted analysis of dotnet/wpf@81131a70a4 (2026-09-14). Data as JSON: /api/errors/a06572efd23757e6. Report an issue: GitHub.

Appendix: source

Thrown at src/Microsoft.DotNet.Wpf/src/WindowsBase/MS/Internal/IO/Packaging/CompressEmulationStream.cs:87

            {
                case SeekOrigin.Begin:
                    {
                        temp = offset;
                        break;
                    }
                case SeekOrigin.Current:
                    {
                        checked { temp = _tempStream.Position + offset; }
                        break;
                    }
                case SeekOrigin.End:
                    {
                        checked { temp = _tempStream.Length + offset; }
                        break;
                    }
                default:
                    {
                        throw new ArgumentOutOfRangeException(nameof(origin), SR.SeekOriginInvalid);
                    }
            }

            if (temp < 0)
            {
                throw new ArgumentException(SR.SeekNegative);
            }

            return _tempStream.Seek(offset, origin);
        }

        /// <summary>
        /// SetLength
        /// </summary>
        public override void SetLength(long newLength)
        {
            CheckDisposed();

View on GitHub (pinned to 81131a70a4)