{"record":{"id":"1f658f2c53147379","repo":"microg/GmsCore","slug":"page-exceeds-range-0-255","errorCode":null,"errorMessage":"page exceeds range [0, 255].","messagePattern":"page exceeds range \\[0, 255\\]\\.","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"play-services-threadnetwork/src/main/java/com/google/android/gms/threadnetwork/ThreadNetworkCredentials.java","lineNumber":141,"sourceCode":"     */\n    public long getUpdatedAtMillis() {\n        return updatedAtMillis;\n    }\n\n    /**\n     * The Channel Mask Entry of Thread Operational Dataset.\n     */\n    public static class ChannelMaskEntry {\n        private final int page;\n        private final byte[] mask;\n\n        /**\n         * Creates a new {@link ChannelMaskEntry} object.\n         *\n         * @throws IllegalArgumentException if page exceeds range [0, 255].\n         */\n        public ChannelMaskEntry(int page, byte[] mask) {\n            if (page < 0 || page > 255) throw new IllegalArgumentException(\"page exceeds range [0, 255].\");\n            this.page = page;\n            this.mask = mask;\n        }\n\n        /**\n         * Returns the Channel Mask.\n         */\n        public byte[] getMask() {\n            return mask;\n        }\n\n        /**\n         * Returns the Channel Page.\n         */\n        public int getPage() {\n            return page;\n        }\n    }","sourceCodeStart":123,"sourceCodeEnd":159,"githubUrl":"https://github.com/microg/GmsCore/blob/157c9d86ac46c195a86c2f15ab55c84036223f95/play-services-threadnetwork/src/main/java/com/google/android/gms/threadnetwork/ThreadNetworkCredentials.java#L123-L159","documentation":"ThreadNetworkCredentials.ChannelMaskEntry's constructor validates that the channel `page` fits in an unsigned byte (0-255) and throws IllegalArgumentException otherwise. Channel pages in Thread identify the PHY channel page and are 8-bit values, so any value outside [0,255] is invalid.","triggerScenarios":"Constructing a ChannelMaskEntry with page < 0 or page > 255, typically from an unvalidated int parsed from user input or a spec/protocol value that doesn't fit in a byte.","commonSituations":"Parsing a page value from JSON/config where it was entered as 256+; sign-extension bugs making a byte negative; confusing channel number with channel page.","solutions":["Clamp or validate the page to 0..255 before constructing ChannelMaskEntry","Use page & 0xFF when converting from a wider integer type to normalize","Check whether the value is a channel number that must first be mapped to a page","Reject the input with a clear message before reaching the constructor"],"exampleFix":"// before\nChannelMaskEntry entry = new ChannelMaskEntry(page, mask); // throws if page out of range\n// after\nint normalizedPage = page & 0xFF;\nif (normalizedPage != page) throw new IllegalArgumentException(\"page must be 0-255\");\nChannelMaskEntry entry = new ChannelMaskEntry(normalizedPage, mask);","handlingStrategy":"validation","validationCode":"if (page < 0 || page > 255) throw new IllegalArgumentException(\"page must be in [0,255], got \" + page);","typeGuard":"boolean isValidChannelPage(int page) { return page >= 0 && page <= 255; }","tryCatchPattern":"try {\n    ChannelMaskEntry e = new ChannelMaskEntry(page, mask);\n} catch (IllegalArgumentException e) {\n    // reject or clamp the page value\n}","preventionTips":["Clamp/normalize with & 0xFF when converting from wider ints","Don't confuse channel numbers with channel pages","Validate config-parsed values before constructing API objects"],"tags":["thread-network","validation","range-check","java"],"backgroundTag":"argument-out-of-range","analyzedSha":"157c9d86ac46c195a86c2f15ab55c84036223f95","analyzedAt":"2026-09-06T17:27:33.892Z","contentChangedAt":"2026-09-06T17:27:33.892Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}