fix(pgtype): return error instead of panicking on malformed geometric text#2566
Merged
Merged
Conversation
… text The text scan plans for circle, box, lseg, path and polygon used the result of strings.IndexByte to slice the input without checking for -1. Malformed text missing a ',' or ')' separator caused a "slice bounds out of range [:-1]" panic, reachable through the public database/sql Scanner API (e.g. Circle.Scan). Guard each IndexByte and return an "invalid format" error, matching the existing point.go behavior. Adds TestGeometricScanMalformedReturnsError and TestGeometricScanValid.
Owner
|
Merged with some additional fixes found during review. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
The text scan plans for
circle,box,lseg,pathandpolygonparse the value by callingstrings.IndexByteto locate a,or)separator and then slicing the string — without checking for the-1"not found" result. Malformed text that is missing an expected separator therefore panics withslice bounds out of range [:-1]instead of returning an error.This is reachable through the public
database/sqlScannerAPI (e.g.Circle.Scan, or scanning a text-format column into one of these types), so malformed/corrupt input turns into a process-crashing panic rather than a normal scan error.Repro (panics before this change):
point.goalready guards this correctly (it usesstrings.Cutand returns"invalid format for point"); these five types were missed. This is the same class of malformed-input panic recently fixed for other types (#2507, #2519, #2520, #2522).Fix
Guard every
strings.IndexByteresult with anif end == -1 { return fmt.Errorf("invalid format for <type>") }before slicing, matching the existingpoint.gobehavior. Behavior for well-formed input is unchanged; this only turns a panic into a returned error (no public API change).Tests
Adds (in
pgtype/geometric_malformed_test.go, no database required):TestGeometricScanMalformedReturnsError— each of the five types returns an error (no panic) on malformed input. Fails before this change (panics), passes after.TestGeometricScanValid— well-formed values still parse correctly.gofmt -l -s,go vet ./pgtype/, andgo build ./...are clean.