diff --git a/config.go b/config.go index 906ed7f4..b2583546 100644 --- a/config.go +++ b/config.go @@ -497,7 +497,8 @@ func parseDSNSettings(s string) (map[string]string, error) { key = strings.Trim(s[:eqIdx], " \t\n\r\v\f") s = strings.TrimLeft(s[eqIdx+1:], " \t\n\r\v\f") - if s[0] != '\'' { + if len(s) == 0 { + } else if s[0] != '\'' { end := 0 for ; end < len(s); end++ { if asciiSpace[s[end]] == 1 { @@ -539,6 +540,10 @@ func parseDSNSettings(s string) (map[string]string, error) { key = k } + if key == "" { + return nil, errors.New("invalid dsn") + } + settings[key] = val } diff --git a/config_test.go b/config_test.go index ebe627b1..264eb299 100644 --- a/config_test.go +++ b/config_test.go @@ -528,6 +528,17 @@ func TestParseConfig(t *testing.T) { } } +// https://github.com/jackc/pgconn/issues/47 +func TestParseConfigDSNWithTrailingEmptyEqualDoesNotPanic(t *testing.T) { + _, err := pgconn.ParseConfig("host= user= password= port= database=") + require.NoError(t, err) +} + +func TestParseConfigDSNLeadingEqual(t *testing.T) { + _, err := pgconn.ParseConfig("= user=jack") + require.Error(t, err) +} + func TestConfigCopyReturnsEqualConfig(t *testing.T) { connString := "postgres://jack:secret@localhost:5432/mydb?application_name=pgxtest&search_path=myschema&connect_timeout=5" original, err := pgconn.ParseConfig(connString)