Skip to content

Commit b045670

Browse files
committed
found, fixed, and tested a nil panic
1 parent 98b9046 commit b045670

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

encoder.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,10 @@ func (e *encoder) marshal(namespace []byte, v reflect.Value, idx int) (bool, err
274274
if t.Kind() == reflect.Ptr && v.IsNil() {
275275
return false, nil
276276
}
277-
um := v.Interface().(Marshaler)
277+
um, ok := v.Interface().(Marshaler)
278+
if !ok {
279+
return false, nil
280+
}
278281
vals, err := um.MarshalForm()
279282
if err != nil {
280283
return false, err

encoder_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1718,3 +1718,50 @@ func Test_MarshalForm_Err(t *testing.T) {
17181718
Equal(t, err.Error(), "Field Namespace:Struct ERROR:always err")
17191719
Equal(t, v3, url.Values{})
17201720
}
1721+
1722+
type errmarshalerptrrec struct {
1723+
called bool
1724+
Fname string
1725+
Sname string
1726+
}
1727+
1728+
func (m *errmarshalerptrrec) MarshalForm() ([]string, error) {
1729+
m.called = true
1730+
return nil, errors.New("always err")
1731+
}
1732+
1733+
func Test_MarshalForm_ErrPtrRec(t *testing.T) {
1734+
encoder := NewEncoder()
1735+
1736+
t1 := struct {
1737+
Ptr *errmarshalerptrrec
1738+
}{
1739+
Ptr: &errmarshalerptrrec{
1740+
Fname: "John",
1741+
Sname: "Smith",
1742+
},
1743+
}
1744+
v1, err := encoder.Encode(t1)
1745+
NotEqual(t, err, nil)
1746+
Equal(t, err.Error(), "Field Namespace:Ptr ERROR:always err")
1747+
Equal(t, v1, url.Values{})
1748+
1749+
t2 := struct {
1750+
NilPtr *errmarshalerptrrec
1751+
}{}
1752+
v2, err := encoder.Encode(t2)
1753+
Equal(t, err, nil)
1754+
Equal(t, v2, url.Values{})
1755+
1756+
t3 := struct {
1757+
Struct errmarshalerptrrec
1758+
}{
1759+
Struct: errmarshalerptrrec{
1760+
Fname: "John",
1761+
Sname: "Smith",
1762+
},
1763+
}
1764+
_, err = encoder.Encode(t3)
1765+
Equal(t, err, nil)
1766+
Equal(t, t3.Struct.called, false)
1767+
}

0 commit comments

Comments
 (0)