From 44079b0d2c9ac3629a8ea9cafe4d75568b376f9e Mon Sep 17 00:00:00 2001 From: Jack Christensen Date: Wed, 29 Jul 2020 22:11:15 -0500 Subject: [PATCH] Fix panic on parsing DSN with trailing '=' Also correctly return error with leading '='. fixes #47 --- config.go | 7 ++++++- config_test.go | 11 +++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) 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)