Skip to content

Commit

Permalink
Recover jmespath panics
Browse files Browse the repository at this point in the history
  • Loading branch information
Jeffail committed Jul 17, 2018
1 parent 869de0f commit 8882905
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 2 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ All notable changes to this project will be documented in this file.

## Unreleased

## 0.17.0 - 2018-07-17

### Changed

- Renamed `content` condition type to `text` in order to clarify its purpose.
Expand Down
11 changes: 10 additions & 1 deletion lib/processor/condition/jmespath.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,15 @@ func NewJMESPath(

//------------------------------------------------------------------------------

func safeSearch(part interface{}, j *jmespath.JMESPath) (res interface{}, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("jmespath panic: %v", r)
}
}()
return j.Search(part)
}

// Check attempts to check a message part against a configured condition.
func (c *JMESPath) Check(msg types.Message) bool {
index := c.part
Expand All @@ -144,7 +153,7 @@ func (c *JMESPath) Check(msg types.Message) bool {
}

var result interface{}
if result, err = c.query.Search(jsonPart); err != nil {
if result, err = safeSearch(jsonPart, c.query); err != nil {
c.mErrJMES.Incr(1)
c.mDropped.Incr(1)
c.log.Debugf("Failed to search json: %v\n", err)
Expand Down
11 changes: 10 additions & 1 deletion lib/processor/jmespath.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,15 @@ func NewJMESPath(

//------------------------------------------------------------------------------

func safeSearch(part interface{}, j *jmespath.JMESPath) (res interface{}, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("jmespath panic: %v", r)
}
}()
return j.Search(part)
}

// ProcessMessage prepends a new message part to the message.
func (p *JMESPath) ProcessMessage(msg types.Message) ([]types.Message, types.Response) {
p.mCount.Incr(1)
Expand All @@ -165,7 +174,7 @@ func (p *JMESPath) ProcessMessage(msg types.Message) ([]types.Message, types.Res
}

var result interface{}
if result, err = p.query.Search(jsonPart); err != nil {
if result, err = safeSearch(jsonPart, p.query); err != nil {
p.mErrJMES.Incr(1)
p.log.Debugf("Failed to search json: %v\n", err)
continue
Expand Down

0 comments on commit 8882905

Please sign in to comment.