{"record":{"id":"ba68cc7bf9ac3526","repo":"apache/answer","slug":"decode-webp-image-error-v","errorCode":null,"errorMessage":"decode webp image error: %v","messagePattern":"decode webp image error: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/checker/file_type.go","lineNumber":145,"sourceCode":"\t}\n\treturn nil\n}\n\nfunc webpImageConfigCheck(file io.Reader, _ string, maxImageMegapixel int) error {\n\tconfig, err := webp.DecodeConfig(file)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"decode webp image config error: %v\", err)\n\t}\n\tif imageSizeTooLarge(config, maxImageMegapixel) {\n\t\treturn fmt.Errorf(\"image size too large\")\n\t}\n\treturn nil\n}\n\nfunc webpImageCheck(file io.Reader, _ string, _ int) error {\n\t_, err := webp.Decode(file)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"decode webp image error: %v\", err)\n\t}\n\treturn nil\n}\n\nfunc imageSizeTooLarge(config image.Config, maxImageMegapixel int) bool {\n\treturn config.Width*config.Height > maxImageMegapixel\n}\n","sourceCodeStart":127,"sourceCodeEnd":153,"githubUrl":"https://github.com/apache/answer/blob/3b9f1370612e690a0b7f230f05e688930db4c6d3/pkg/checker/file_type.go#L127-L153","documentation":"webpImageCheck wraps errors from webp.Decode at pkg/checker/file_type.go:145. Thrown when the WebP header is valid but full pixel decoding fails — corrupt VP8/VP8L bitstream, truncation mid-frame, or unsupported extended-format features (e.g. some animation/alpha combinations in x/image/webp).","triggerScenarios":"Second-stage full decode of a .webp file: body corruption after a valid header, truncated frame data, or animated/extended WebP that x/image/webp cannot fully decode.","commonSituations":"Animated WebP from modern browsers/encoders rejected by the older x/image/webp library; interrupted uploads; WebP files damaged by non-binary-safe transfer.","solutions":["Upgrade golang.org/x/image to the latest release for broader WebP (animation/alpha) support","Re-encode the file with ffmpeg/cwebp to a plain lossy or lossless WebP","Check for upload truncation (Content-Length vs received bytes, proxy buffering)","Convert to PNG/JPEG server-side as a fallback when WebP full decode fails"],"exampleFix":"// before: pin old x/image\nrequire golang.org/x/image v0.0.0-2019...\n// after\ngo get golang.org/x/image@latest // supports newer WebP features","handlingStrategy":"try-catch","validationCode":"head := make([]byte, 12)\nio.ReadFull(f, head)\nif string(head[0:4]) != \"RIFF\" || string(head[8:12]) != \"WEBP\" { return errors.New(\"not webp\") }","typeGuard":"func isWebPFullDecodeErr(err error) bool { return err != nil && strings.HasPrefix(err.Error(), \"decode webp image error\") }","tryCatchPattern":"if _, err := webp.Decode(f); err != nil {\n\t// fall back to another decoder or re-encode via external tool\n\treturn fmt.Errorf(\"webp full decode failed: %w\", err)\n}","preventionTips":["Upgrade golang.org/x/image@latest for broader WebP support","Verify upload completeness (byte counts) to rule out truncation","Re-encode animated WebP with ffmpeg when the library rejects it","Keep a server-side conversion fallback (WebP -> PNG/JPEG)"],"tags":["go","webp","image-decoding","library-limitation"],"backgroundTag":"image-decode-failed","analyzedSha":"3b9f1370612e690a0b7f230f05e688930db4c6d3","analyzedAt":"2026-09-05T18:18:39.533Z","contentChangedAt":"2026-09-05T18:18:39.533Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}