apache/answer · error
decode image config error: %v
Error message
decode image config error: %v
What it means
formatSpecificConfigCheck wraps any error returned by the format-specific image header decoders (jpeg.DecodeConfig, png.DecodeConfig, gif.DecodeConfig) in pkg/checker/file_type.go:104. It is thrown when the file cannot have its width/height header parsed as the extension claims (jpg/jpeg, png, or gif). It means the file is corrupt, truncated, or not actually the image format its extension suggests.
Source
Thrown at pkg/checker/file_type.go:104
// formatSpecificConfigCheck decodes image config using a format-specific decoder
// based on the file extension. This avoids calling image.DecodeConfig() which
// dispatches by magic bytes and can invoke unintended decoders (e.g., TIFF)
// registered by transitive dependencies.
func formatSpecificConfigCheck(file io.Reader, ext string, maxImageMegapixel int) error {
var config image.Config
var err error
switch ext {
case "jpg", "jpeg":
config, err = jpeg.DecodeConfig(file)
case "png":
config, err = png.DecodeConfig(file)
case "gif":
config, err = gif.DecodeConfig(file)
default:
return fmt.Errorf("unsupported image format: %s", ext)
}
if err != nil {
return fmt.Errorf("decode image config error: %v", err)
}
if imageSizeTooLarge(config, maxImageMegapixel) {
return fmt.Errorf("image size too large")
}
return nil
}
// formatSpecificImageCheck fully decodes the image using a format-specific decoder.
func formatSpecificImageCheck(file io.Reader, ext string, _ int) error {
var err error
switch ext {
case "jpg", "jpeg":
_, err = jpeg.Decode(file)
case "png":
_, err = png.Decode(file)
case "gif":
_, err = gif.Decode(file)
default:View on GitHub (pinned to 3b9f137061)
Solutions
- Verify the uploaded file is genuinely a valid JPEG/PNG/GIF (check magic bytes before saving or calling the checker)
- Re-upload the file; ask the user to retry the upload since truncation is a common cause
- Ensure the file extension matches the actual content; reject mismatched files at upload time
- Log the wrapped underlying error (%v) to identify the exact decoder failure
Example fix
// before: accept any upload then decode
err := checker.DecodeAndCheckImageFile(path, maxMegapixel)
// after: pre-validate magic bytes
head := make([]byte, 8)
f, _ := os.Open(path); io.ReadFull(f, head); f.Close()
if !isJPEG(head) && !isPNG(head) && !isGIF(head) { return errors.New("not a real image") } Defensive patterns
Strategy: validation
Validate before calling
func looksLikeImage(head []byte) bool {
switch {
case len(head) >= 3 && head[0] == 0xFF && head[1] == 0xD8 && head[2] == 0xFF: return true // jpeg
case len(head) >= 8 && string(head[1:4]) == "PNG": return true
case len(head) >= 6 && string(head[0:3]) == "GIF": return true
}
return false
} Type guard
func isImageDecodeErr(err error) bool { return err != nil && strings.HasPrefix(err.Error(), "decode image config error") } Try / catch
if err := checker.DecodeAndCheckImageFile(path, maxMP); !ok {
log.Printf("rejecting upload %s: invalid or corrupt image", path)
return fmt.Errorf("invalid image file")
} Prevention
- Validate magic bytes before accepting any upload
- Reject files whose extension does not match detected content type
- Detect truncated uploads via Content-Length comparison
- Always log the wrapped underlying decode error for diagnosis
When it happens
Trigger: DecodeAndCheckImageFile is called on a file with ext jpg/jpeg/png/gif and the corresponding DecodeConfig fails: truncated or corrupt header, empty file, HTML/text/renamed file with an image extension, or a partial upload.
Common situations: Users upload renamed files (e.g. a .webp or SVG renamed to .png), uploads interrupted mid-transfer, or files corrupted by bad proxy/storage handling. Also hit when a dependency-registered decoder mismatch causes header parse failure.
Related errors
- decode image error: %v
- decode webp image config error: %v
- File validation failed
- validate check exception
- base.request_format_error
AI-assisted analysis of apache/answer@3b9f137061 (2026-09-05).
Data as JSON: /api/errors/1b20565303179782.
Report an issue: GitHub.