Skip to content

Commit 11a4d0a

Browse files
committed
[FAB-3215] fix panic in policy parser code
This change set ensures that bad input doesn't cause the policy parser code to panic. Tests have also been added. Change-Id: If844c3e5fd5a4945e4d47bc74030ca54d68219b8 Signed-off-by: Alessandro Sorniotti <[email protected]>
1 parent fa63fb9 commit 11a4d0a

File tree

2 files changed

+34
-2
lines changed

2 files changed

+34
-2
lines changed

common/cauthdsl/policyparser.go

+27-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
)
3030

3131
var regex *regexp.Regexp = regexp.MustCompile("^([[:alnum:]]+)([.])(member|admin)$")
32+
var regexErr *regexp.Regexp = regexp.MustCompile("^No parameter '([^']+)' found[.]$")
3233

3334
func and(args ...interface{}) (interface{}, error) {
3435
toret := "outof(" + strconv.Itoa(len(args))
@@ -209,8 +210,16 @@ func FromString(policy string) (*common.SignaturePolicyEnvelope, error) {
209210
return nil, err
210211
}
211212

212-
intermediateRes, err := intermediate.Evaluate(nil)
213+
intermediateRes, err := intermediate.Evaluate(map[string]interface{}{})
213214
if err != nil {
215+
// attempt to produce a meaningful error
216+
if regexErr.MatchString(err.Error()) {
217+
sm := regexErr.FindStringSubmatch(err.Error())
218+
if len(sm) == 2 {
219+
return nil, fmt.Errorf("unrecognized token '%s' in policy string", sm[1])
220+
}
221+
}
222+
214223
return nil, err
215224
}
216225

@@ -225,8 +234,16 @@ func FromString(policy string) (*common.SignaturePolicyEnvelope, error) {
225234
return nil, err
226235
}
227236

228-
res, err := exp.Evaluate(nil)
237+
res, err := exp.Evaluate(map[string]interface{}{})
229238
if err != nil {
239+
// attempt to produce a meaningful error
240+
if regexErr.MatchString(err.Error()) {
241+
sm := regexErr.FindStringSubmatch(err.Error())
242+
if len(sm) == 2 {
243+
return nil, fmt.Errorf("unrecognized token '%s' in policy string", sm[1])
244+
}
245+
}
246+
230247
return nil, err
231248
}
232249

@@ -241,6 +258,14 @@ func FromString(policy string) (*common.SignaturePolicyEnvelope, error) {
241258

242259
res, err = exp.Evaluate(parameters)
243260
if err != nil {
261+
// attempt to produce a meaningful error
262+
if regexErr.MatchString(err.Error()) {
263+
sm := regexErr.FindStringSubmatch(err.Error())
264+
if len(sm) == 2 {
265+
return nil, fmt.Errorf("unrecognized token '%s' in policy string", sm[1])
266+
}
267+
}
268+
244269
return nil, err
245270
}
246271

common/cauthdsl/policyparser_test.go

+7
Original file line numberDiff line numberDiff line change
@@ -129,3 +129,10 @@ func TestComplex2(t *testing.T) {
129129

130130
assert.True(t, reflect.DeepEqual(p1, p2))
131131
}
132+
133+
func TestBadStringsNoPanic(t *testing.T) {
134+
_, err := FromString("OR('A.member', 'Bmember')")
135+
assert.Error(t, err)
136+
_, err = FromString("OR('A.member', Bmember)")
137+
assert.Error(t, err)
138+
}

0 commit comments

Comments
 (0)