7
7
// Compare implements the pairwise CPE comparison algorithm as defined by
8
8
// the CPE Name Matching spec: https://nvlpubs.nist.gov/nistpubs/Legacy/IR/nistir7696.pdf
9
9
func Compare (src , tgt WFN ) Relations {
10
+ // Per Section 5.4.2 of the CPE Naming specification, "any" and "unset" are
11
+ // equivalent when reading from a WFN.
10
12
var m [NumAttr ]Relation
11
13
for i := 0 ; i < NumAttr ; i ++ {
12
14
sv , tv := src .Attr [i ], tgt .Attr [i ]
@@ -16,9 +18,9 @@ func Compare(src, tgt WFN) Relations {
16
18
continue
17
19
}
18
20
switch sv .Kind {
19
- case ValueAny :
21
+ case ValueAny , ValueUnset :
20
22
switch tv .Kind {
21
- case ValueAny :
23
+ case ValueAny , ValueUnset :
22
24
m [i ] = Equal
23
25
case ValueNA :
24
26
m [i ] = Superset
@@ -27,7 +29,7 @@ func Compare(src, tgt WFN) Relations {
27
29
}
28
30
case ValueNA :
29
31
switch tv .Kind {
30
- case ValueAny :
32
+ case ValueAny , ValueUnset :
31
33
m [i ] = Subset
32
34
case ValueNA :
33
35
m [i ] = Equal
@@ -37,7 +39,7 @@ func Compare(src, tgt WFN) Relations {
37
39
case ValueSet :
38
40
if hasWildcard (sv .V ) {
39
41
switch tv .Kind {
40
- case ValueAny :
42
+ case ValueAny , ValueUnset :
41
43
m [i ] = Subset
42
44
case ValueNA :
43
45
m [i ] = Disjoint
@@ -51,7 +53,7 @@ func Compare(src, tgt WFN) Relations {
51
53
break
52
54
}
53
55
switch tv .Kind {
54
- case ValueAny :
56
+ case ValueAny , ValueUnset :
55
57
m [i ] = Subset
56
58
case ValueNA :
57
59
m [i ] = Disjoint
@@ -62,12 +64,6 @@ func Compare(src, tgt WFN) Relations {
62
64
}
63
65
m [i ] = Disjoint
64
66
}
65
- case ValueUnset :
66
- if tv .Kind == ValueUnset {
67
- m [i ] = Equal
68
- break
69
- }
70
- m [i ] = Disjoint
71
67
}
72
68
}
73
69
return m
0 commit comments