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

  1. Verify the uploaded file is genuinely a valid JPEG/PNG/GIF (check magic bytes before saving or calling the checker)
  2. Re-upload the file; ask the user to retry the upload since truncation is a common cause
  3. Ensure the file extension matches the actual content; reject mismatched files at upload time
  4. 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

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


AI-assisted analysis of apache/answer@3b9f137061 (2026-09-05). Data as JSON: /api/errors/1b20565303179782. Report an issue: GitHub.