From 9e94aa87b139d1f3afebbd79fb79de1d2070373d Mon Sep 17 00:00:00 2001 From: jaltavilla Date: Thu, 3 Oct 2019 18:31:55 -0400 Subject: [PATCH] Move the second part of the nil check earlier in the function. This fixes a panic under certain conditions. 1. arg is a pointer to nil 2. The type of arg implements BinaryEncoder or TextEncoder 3. The implementation of that interface uses a non-pointer receiver --- extended_query_builder.go | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/extended_query_builder.go b/extended_query_builder.go index db9a0d73..1d024911 100644 --- a/extended_query_builder.go +++ b/extended_query_builder.go @@ -67,6 +67,13 @@ func (eqb *extendedQueryBuilder) encodeExtendedParamValue(ci *pgtype.ConnInfo, o return nil, nil } + refVal := reflect.ValueOf(arg) + argIsPtr := refVal.Kind() == reflect.Ptr + + if argIsPtr && refVal.IsNil() { + return nil, nil + } + if eqb.paramValueBytes == nil { eqb.paramValueBytes = make([]byte, 0, 128) } @@ -100,12 +107,9 @@ func (eqb *extendedQueryBuilder) encodeExtendedParamValue(ci *pgtype.ConnInfo, o return []byte(arg), nil } - refVal := reflect.ValueOf(arg) - - if refVal.Kind() == reflect.Ptr { - if refVal.IsNil() { - return nil, nil - } + if argIsPtr { + // We have already checked that arg is not pointing to nil, + // so it is safe to dereference here. arg = refVal.Elem().Interface() return eqb.encodeExtendedParamValue(ci, oid, arg) }