{"record":{"id":"1254910bed833d2f","repo":"tursodatabase/turso","slug":"database-page-number-does-not-fit-u32-page-no","errorCode":null,"errorMessage":"database page number does not fit u32: {page_no}","messagePattern":"database page number does not fit u32: (.+?)","errorType":"http","errorClass":null,"httpStatus":500,"severity":"error","filePath":"cli/sync_server.rs","lineNumber":857,"sourceCode":"            status: 200,\n            content_type: \"application/protobuf\".to_string(),\n            body: response_body,\n        })\n    }\n\n    #[allow(clippy::type_complexity)]\n    fn read_replace_base_pages(&self) -> Result<(u64, Vec<(u64, Vec<u8>)>)> {\n        let conn = self.conn.lock().unwrap();\n        let wal_state = conn.wal_state()?;\n        let frame_watermark = Some(wal_state.max_frame);\n        let db_size = current_snapshot_db_size_pages(&conn, wal_state.max_frame)?;\n        let pages_capacity = usize::try_from(db_size)\n            .map_err(|_| anyhow!(\"database page count does not fit usize: {db_size}\"))?;\n        let mut pages = Vec::with_capacity(pages_capacity);\n\n        for page_no in 1..=db_size {\n            let page_no_u32 = u32::try_from(page_no)\n                .map_err(|_| anyhow!(\"database page number does not fit u32: {page_no}\"))?;\n            let mut page = vec![0; PAGE_SIZE];\n            let found =\n                conn.try_wal_watermark_read_page(page_no_u32, &mut page, frame_watermark)?;\n            if !found {\n                return Err(anyhow!(\n                    \"database page {} is missing from replace-base snapshot\",\n                    page_no\n                ));\n            }\n            pages.push((page_no - 1, page));\n        }\n\n        Ok((db_size, pages))\n    }\n}\n\nstruct HttpResponse {\n    status: u16,","sourceCodeStart":839,"sourceCodeEnd":875,"githubUrl":"https://github.com/tursodatabase/turso/blob/bad083fafbefdeae9a42ec19bdaaad8918dcf411/cli/sync_server.rs#L839-L875","documentation":"When serving replace-base pages, each page number in 1..=db_size is converted to u32 before calling try_wal_watermark_read_page. db_size greater than u32::MAX fails the conversion. SQLite-family databases store the page count in a 32-bit header field, so a value this large indicates corrupt snapshot metadata rather than a real database.","triggerScenarios":"A corrupt or fabricated db_size above u32::MAX reaching the replace-base page loop on any platform.","commonSituations":"Damaged WAL snapshot metadata after a crash; tests that inject arbitrary db_size values.","solutions":["Treat db_size > u32::MAX as corruption: verify the database header and WAL snapshot.","Rebuild the server database and re-bootstrap clients if metadata is damaged.","No real database reaches this size; do not attempt to serve it."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if reported_page_count > u32::MAX as u64 {\n    return Err(\"page count beyond u32 cannot be a real SQLite-family db; treat as corruption\".into());\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat db_size above u32::MAX as corrupt snapshot metadata, never as a servable database.","Verify database header and WAL state after crashes that could damage metadata."],"tags":["sync","snapshot","integer-overflow","pages","corruption"],"backgroundTag":"integer-conversion-overflow","analyzedSha":"bad083fafbefdeae9a42ec19bdaaad8918dcf411","analyzedAt":"2026-08-16T23:12:11.798Z","schemaVersion":2},"datasetVersion":"2026-08-17T04:17:16.089Z"}