{"record":{"id":"c7746dc87c7ec71e","repo":"d2lang/d2","slug":"checksum-error-in-table-v","errorCode":null,"errorMessage":"checksum error in table: %v","messagePattern":"checksum error in table: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"lib/font/font.go","lineNumber":124,"sourceCode":"\t\t\tLength:   binary.BigEndian.Uint32(table[SFNT_OFFSET_LENGTH:]),\n\t\t}\n\n\t\tentries = append(entries, entry)\n\t}\n\tsort.Slice(entries, func(i, j int) bool {\n\t\treturn string(entries[i].Tag) < string(entries[j].Tag)\n\t})\n\n\tsfntSize := uint32(SIZE_OF_SFNT_HEADER + int(numTables)*SIZE_OF_SFNT_TABLE_ENTRY)\n\ttableInfo := make([]byte, int(numTables)*SIZE_OF_WOFF_ENTRY)\n\n\tfor i := 0; i < len(entries); i++ {\n\t\ttableEntry := entries[i]\n\t\tif string(tableEntry.Tag) != \"head\" {\n\t\t\talignTable := fontBuf[tableEntry.Offset : tableEntry.Offset+longAlign(tableEntry.Length)]\n\n\t\t\tif calcChecksum(alignTable) != tableEntry.CheckSum {\n\t\t\t\treturn nil, fmt.Errorf(\"checksum error in table: %v\", string(tableEntry.Tag))\n\t\t\t}\n\t\t}\n\n\t\tbinary.BigEndian.PutUint32(tableInfo[i*SIZE_OF_WOFF_ENTRY+WOFF_ENTRY_OFFSET_TAG:], binary.BigEndian.Uint32(tableEntry.Tag))\n\t\tbinary.BigEndian.PutUint32(tableInfo[i*SIZE_OF_WOFF_ENTRY+WOFF_ENTRY_OFFSET_LENGTH:], tableEntry.Length)\n\t\tbinary.BigEndian.PutUint32(tableInfo[i*SIZE_OF_WOFF_ENTRY+WOFF_ENTRY_OFFSET_CHECKSUM:], tableEntry.CheckSum)\n\n\t\tsfntSize += longAlign(tableEntry.Length)\n\t}\n\n\tsfntOffset := uint32(SIZE_OF_SFNT_HEADER + len(entries)*SIZE_OF_SFNT_TABLE_ENTRY)\n\tcsum := calcChecksum(fontBuf[:SIZE_OF_SFNT_HEADER])\n\tfor i := 0; i < len(entries); i++ {\n\t\ttableEntry := entries[i]\n\n\t\tb := make([]byte, SIZE_OF_SFNT_TABLE_ENTRY)\n\t\tbinary.BigEndian.PutUint32(b[SFNT_OFFSET_TAG:], binary.BigEndian.Uint32(tableEntry.Tag))\n\t\tbinary.BigEndian.PutUint32(b[SFNT_OFFSET_CHECKSUM:], tableEntry.CheckSum)","sourceCodeStart":106,"sourceCodeEnd":142,"githubUrl":"https://github.com/d2lang/d2/blob/0d69dca6f532ceaeacd615d35d1eaa41a238ffdb/lib/font/font.go#L106-L142","documentation":"Sfnt2Woff converts an SFNT font (TTF/OTF) to WOFF. It validates each table's checksum (except the 'head' table) before writing WOFF table metadata; a mismatch means the source font buffer is corrupt or was modified after its tables were written.","triggerScenarios":"Calling Sfnt2Woff with a font whose table checksums don't match the computed calcChecksum of its aligned table data — typically a truncated, bit-corrupted, or hand-patched font file.","commonSituations":"Fonts fetched over the network with incomplete downloads, fonts stored in version control/assets corrupted by line-ending or encoding filters, or fonts modified by tooling without recomputing checksums.","solutions":["Re-download or restore the font from a trusted source and verify its hash","Ensure no text-mode processing (git autocrlf, base64 mangling) altered the binary","Open the font in a validator (e.g. fonttools ttx) to identify the failing table reported in %v","If embedding fonts, ship them as binary assets with checksum verification"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"f, err := os.Open(fontPath)\nif err != nil {\n    return err\n}\ninfo, _ := f.Stat()\nif info.Size() < 12 {\n    return errors.New(\"font file too small to be valid SFNT\")\n}\nhead := make([]byte, 4)\nf.Read(head)\nif !bytes.Equal(head, []byte{0, 1, 0, 0}) && !bytes.Equal(head, []byte(\"OTTO\")) {\n    return fmt.Errorf(\"not a TTF/OTF font: magic %x\", head)\n}","typeGuard":"func isSFNT(data []byte) bool {\n    return len(data) >= 4 && (bytes.Equal(data[:4], []byte{0, 1, 0, 0}) || bytes.Equal(data[:4], []byte(\"OTTO\")))\n}","tryCatchPattern":"woff, err := font.Sfnt2Woff(fontBuf)\nif err != nil {\n    if strings.HasPrefix(err.Error(), \"checksum error in table\") {\n        log.Printf(\"corrupt font table: %v — re-fetch asset\", err)\n    }\n    return err\n}","preventionTips":["Verify font file hashes after download/storage","Never let git or text tooling mangle binary font assets (.gitattributes: binary)","Validate fonts with ttx/fonttools before running conversion"],"tags":["font","woff","checksum","corruption"],"backgroundTag":"font-checksum-mismatch","analyzedSha":"0d69dca6f532ceaeacd615d35d1eaa41a238ffdb","analyzedAt":"2026-08-31T12:19:21.182Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}