Skip to content

Commit c304a49

Browse files
committed
[patch] fixed Wrapf method causing nil pointer dereference when original error is not of type *Error
1 parent fa23547 commit c304a49

File tree

2 files changed

+61
-16
lines changed

2 files changed

+61
-16
lines changed

helper.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,33 +27,33 @@ func newerrf(e error, file string, line int, etype errType, format string, args
2727
// Wrap is used to simply wrap an error with no custom error message with Error struct; with the error
2828
// type being defaulted to `TypeInternal`
2929
// If the error being wrapped is already of type Error, then its respective type is used
30-
func Wrap(err error, msg ...string) *Error {
30+
func Wrap(original error, msg ...string) *Error {
3131
message := strings.Join(msg, ". ")
3232
_, file, line, _ := runtime.Caller(1)
33-
e, _ := err.(*Error)
33+
e, _ := original.(*Error)
3434
if e == nil {
35-
return newerr(err, message, file, line, TypeInternal)
35+
return newerr(original, message, file, line, TypeInternal)
3636
}
37-
return newerr(err, message, file, line, e.eType)
37+
return newerr(original, message, file, line, e.eType)
3838
}
3939

40-
func Wrapf(err error, format string, args ...interface{}) *Error {
40+
func Wrapf(original error, format string, args ...interface{}) *Error {
4141
_, file, line, _ := runtime.Caller(1)
42-
e, _ := err.(*Error)
42+
e, _ := original.(*Error)
4343
if e == nil {
44-
return newerrf(e, file, line, TypeInternal, format, args...)
44+
return newerrf(original, file, line, TypeInternal, format, args...)
4545
}
46-
return newerrf(e, file, line, e.Type(), format, args...)
46+
return newerrf(original, file, line, e.Type(), format, args...)
4747
}
4848

4949
// WrapWithMsg [deprecated, use `Wrap`] wrap error with a user friendly message
50-
func WrapWithMsg(err error, msg string) *Error {
50+
func WrapWithMsg(original error, msg string) *Error {
5151
_, file, line, _ := runtime.Caller(1)
52-
e, _ := err.(*Error)
52+
e, _ := original.(*Error)
5353
if e == nil {
54-
return newerr(err, msg, file, line, TypeInternal)
54+
return newerr(original, msg, file, line, TypeInternal)
5555
}
56-
return newerr(err, msg, file, line, e.eType)
56+
return newerr(original, msg, file, line, e.eType)
5757
}
5858

5959
// NewWithType returns an error instance with custom error type
@@ -69,15 +69,15 @@ func NewWithTypef(etype errType, format string, args ...interface{}) *Error {
6969
}
7070

7171
// NewWithErrMsgType returns an error instance with custom error type and message
72-
func NewWithErrMsgType(e error, message string, etype errType) *Error {
72+
func NewWithErrMsgType(original error, message string, etype errType) *Error {
7373
_, file, line, _ := runtime.Caller(1)
74-
return newerr(e, message, file, line, etype)
74+
return newerr(original, message, file, line, etype)
7575
}
7676

7777
// NewWithErrMsgTypef returns an error instance with custom error type and formatted message
78-
func NewWithErrMsgTypef(e error, etype errType, format string, args ...interface{}) *Error {
78+
func NewWithErrMsgTypef(original error, etype errType, format string, args ...interface{}) *Error {
7979
_, file, line, _ := runtime.Caller(1)
80-
return newerrf(e, file, line, etype, format, args...)
80+
return newerrf(original, file, line, etype, format, args...)
8181
}
8282

8383
// Internal helper method for creating internal errors

helper_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1212,3 +1212,48 @@ func Test_newerrf(t *testing.T) {
12121212
})
12131213
}
12141214
}
1215+
1216+
func TestWrapf(t *testing.T) {
1217+
type args struct {
1218+
original error
1219+
format string
1220+
args []interface{}
1221+
}
1222+
tests := []struct {
1223+
name string
1224+
args args
1225+
}{
1226+
{
1227+
name: "with original error",
1228+
args: args{
1229+
original: errors.New("hello error"),
1230+
format: "failed to retrieve (id: %d)",
1231+
args: []interface{}{
1232+
1,
1233+
},
1234+
},
1235+
},
1236+
{
1237+
name: "no original error",
1238+
args: args{
1239+
original: nil,
1240+
format: "failed to retrieve (id: %d)",
1241+
args: []interface{}{
1242+
1,
1243+
},
1244+
},
1245+
},
1246+
}
1247+
1248+
for _, tt := range tests {
1249+
t.Run(tt.name, func(t *testing.T) {
1250+
got := Wrapf(tt.args.original, tt.args.format, tt.args.args...)
1251+
_, file, line, _ := runtime.Caller(0)
1252+
line--
1253+
want := newerrf(tt.args.original, file, line, TypeInternal, tt.args.format, tt.args.args...)
1254+
if !reflect.DeepEqual(got, want) {
1255+
t.Errorf("wanted '%v' got '%v'", want, got)
1256+
}
1257+
})
1258+
}
1259+
}

0 commit comments

Comments
 (0)