{"record":{"id":"1ec064268edd90f2","repo":"dotnet/wpf","slug":"argumentoutofrangeexception-parameter-origin","errorCode":null,"errorMessage":"ArgumentOutOfRangeException (Parameter 'origin')","messagePattern":"ArgumentOutOfRangeException \\(Parameter 'origin'\\)","errorType":"exception","errorClass":"ArgumentOutOfRangeException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/WindowsBase/MS/Internal/IO/Packaging/SparseMemoryStream.cs","lineNumber":154,"sourceCode":"        {\n            CheckDisposed();\n            long newStreamPosition = _currentStreamPosition;\n\n            if (origin ==SeekOrigin.Begin)\n            {\n                newStreamPosition = offset;\n            }\n            else if  (origin == SeekOrigin.Current)\n            {\n                checked { newStreamPosition += offset; }\n            }\n            else if  (origin == SeekOrigin.End)\n            {\n                checked { newStreamPosition = _currentStreamLength + offset; }\n            }\n            else\n            {\n                throw new ArgumentOutOfRangeException(nameof(origin));\n            }\n\n            if (newStreamPosition  < 0)\n            {\n                 throw new ArgumentException(SR.SeekNegative);\n            }\n            _currentStreamPosition = newStreamPosition;\n\n            return _currentStreamPosition;\n        }\n\n        public override int Read(byte[] buffer, int offset, int count)\n        {\n            CheckDisposed();\n\n            PackagingUtilities.VerifyStreamReadArgs(this, buffer, offset, count);\n\n            Debug.Assert(_currentStreamPosition >= 0);","sourceCodeStart":136,"sourceCodeEnd":172,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/WindowsBase/MS/Internal/IO/Packaging/SparseMemoryStream.cs#L136-L172","documentation":"ArgumentOutOfRangeException named 'origin' thrown by SparseMemoryStream.Seek when the seek origin is not Begin, Current, or End. Any value outside the SeekOrigin enum (e.g. a cast of an invalid int) falls into the else branch and is rejected before any position arithmetic happens.","triggerScenarios":"Calling SparseMemoryStream.Seek(offset, (SeekOrigin)99) or passing an uninitialized/invalid SeekOrigin obtained via unsafe casting or default(int) conversion.","commonSituations":"Generic stream-wrapper code that forwards an origin parameter cast from an int without validating it; interop code marshaling seek origins from native enums.","solutions":["Pass only SeekOrigin.Begin, SeekOrigin.Current, or SeekOrigin.End.","Validate the origin value before casting int -> SeekOrigin.","Fix the caller that computes the origin dynamically to use Enum.IsOrigin checks."],"exampleFix":"// before\nstream.Seek(offset, (SeekOrigin)someInt); // someInt may be invalid\n// after\nif (Enum.IsDefined(typeof(SeekOrigin), someInt))\n    stream.Seek(offset, (SeekOrigin)someInt);","handlingStrategy":"validation","validationCode":"if (!Enum.IsDefined(typeof(SeekOrigin), origin)) throw new ArgumentOutOfRangeException(nameof(origin));","typeGuard":"bool IsValidSeekOrigin(SeekOrigin o) => o is SeekOrigin.Begin or SeekOrigin.Current or SeekOrigin.End;","tryCatchPattern":"try { stream.Seek(offset, origin); }\ncatch (ArgumentOutOfRangeException ex) when (ex.ParamName == \"origin\") { /* fix origin value */ }","preventionTips":["Never cast raw ints to SeekOrigin","Pass SeekOrigin constants directly","Validate forwarded parameters in stream wrappers"],"tags":["stream","seek","argumentoutofrangeexception","enum"],"backgroundTag":"invalid-enum-value","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-21T21:30:21.729Z"}