From 2afddedda837064a1c0a42998e27711181884217 Mon Sep 17 00:00:00 2001 From: James Hartig Date: Wed, 1 Jun 2022 10:57:42 -0400 Subject: [PATCH] protect against panic from PlanScan when interface{}(nil) is passed --- pgtype.go | 2 +- pgtype_test.go | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/pgtype.go b/pgtype.go index 4078da7b..08e7395e 100644 --- a/pgtype.go +++ b/pgtype.go @@ -799,7 +799,7 @@ func isScanner(dst interface{}) bool { if _, ok := dst.(sql.Scanner); ok { return true } - if t := reflect.TypeOf(dst); t.Kind() == reflect.Ptr && t.Elem().Implements(scannerType) { + if t := reflect.TypeOf(dst); t != nil && t.Kind() == reflect.Ptr && t.Elem().Implements(scannerType) { return true } return false diff --git a/pgtype_test.go b/pgtype_test.go index 9127766f..67f36373 100644 --- a/pgtype_test.go +++ b/pgtype_test.go @@ -351,3 +351,13 @@ func TestScanPlanBinaryInt32ScanScanner(t *testing.T) { require.NoError(t, err) assert.Nil(t, ptr) } + +// Test for https://github.com/jackc/pgtype/issues/164 +func TestScanPlanInterface(t *testing.T) { + ci := pgtype.NewConnInfo() + src := []byte{0, 42} + var v interface{} + plan := ci.PlanScan(pgtype.Int2OID, pgtype.BinaryFormatCode, v) + err := plan.Scan(ci, pgtype.Int2OID, pgtype.BinaryFormatCode, src, v) + assert.Error(t, err) +}