{"record":{"id":"d1738c017949d41a","repo":"siyuan-note/siyuan","slug":"avif-invalid-exif-magic-number","errorCode":null,"errorMessage":"avif: invalid exif magic number","messagePattern":"avif: invalid exif magic number","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"kernel/heif/internal/h265heic/exif.go","lineNumber":286,"sourceCode":"\treturn float64(num) / float64(den)\n}\n\nfunc parseExifData(data []byte, exif *Exif) error {\n\tif len(data) < 8 {\n\t\treturn errors.New(\"avif: exif data too short\")\n\t}\n\n\tr := &exifReader{data: data}\n\tswitch {\n\tcase data[0] == 'I' && data[1] == 'I':\n\t\tr.littleEndian = true\n\tcase data[0] == 'M' && data[1] == 'M':\n\tdefault:\n\t\treturn errors.New(\"avif: invalid exif byte order marker\")\n\t}\n\n\tif r.uint16(2) != 42 {\n\t\treturn errors.New(\"avif: invalid exif magic number\")\n\t}\n\n\tifdOffset := r.uint32(4)\n\tif ifdOffset < 8 || int(ifdOffset) >= len(data) {\n\t\treturn errors.New(\"avif: invalid exif ifd offset\")\n\t}\n\n\texifIFDOffset, gpsIFDOffset := parseIFD(r, int(ifdOffset), exif)\n\tif exifIFDOffset > 0 {\n\t\tparseExifSubIFD(r, exifIFDOffset, exif)\n\t}\n\tif gpsIFDOffset > 0 {\n\t\tparseGPSSubIFD(r, gpsIFDOffset, exif)\n\t}\n\n\treturn nil\n}\n","sourceCodeStart":268,"sourceCodeEnd":304,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/8641553a1f07374001902d3ce773285db1292b2d/kernel/heif/internal/h265heic/exif.go#L268-L304","documentation":"After the byte-order marker, an EXIF TIFF header must contain the magic number 42 at offset 2. The parser read a different value, so the payload is not a valid EXIF/TIFF structure despite having plausible 'II'/'MM' markers. This confirms the payload is corrupt or not actually EXIF data.","triggerScenarios":"DecodeExif on a payload whose bytes 2-3 (per declared endianness) do not equal 42 — e.g. sliced into the middle of a larger blob, or a fabricated/fuzzed TIFF header.","commonSituations":"Off-by-N slicing of the Exif item; files produced by buggy metadata writers; binary blobs mislabeled as Exif items in the HEIF meta box.","solutions":["Verify the Exif item's data extent points at the TIFF header start, not into the payload","Dump the first 8 bytes and compare against the expected II\\x2a\\x00 or MM\\x00\\x2a header","Treat EXIF as unavailable and continue rendering the image without orientation/GPS metadata","Regenerate the file with a standards-compliant writer if it is your own tooling"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"func looksLikeExifTIFF(data []byte) bool {\n\tif len(data) < 4 {\n\t\treturn false\n\t}\n\tif data[0] == 'I' && data[1] == 'I' {\n\t\treturn binary.LittleEndian.Uint16(data[2:4]) == 42\n\t}\n\tif data[0] == 'M' && data[1] == 'M' {\n\t\treturn binary.BigEndian.Uint16(data[2:4]) == 42\n\t}\n\treturn false\n}","typeGuard":"func isWellFormedTIFFHeader(b []byte) bool { return looksLikeExifTIFF(b) }","tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"invalid exif magic number\") {\n\tlog.Warnf(\"EXIF payload is not a TIFF structure: %v\", err)\n\treturn nil\n}","preventionTips":["Validate the full 8-byte TIFF header (marker + magic 42) before IFD parsing","Check item extents so slicing never starts mid-blob","Treat metadata parse errors as non-fatal and continue with defaults","Regenerate files with standards-compliant EXIF writers in your own pipelines"],"tags":["exif","metadata","tiff-header","magic-number"],"backgroundTag":"schema-validation-failed","analyzedSha":"8641553a1f07374001902d3ce773285db1292b2d","analyzedAt":"2026-09-11T16:08:28.414Z","contentChangedAt":"2026-09-11T16:08:28.414Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}