Skip to content

Commit 147b26c

Browse files
committed
Added option to exclude survived gadgets from fingerprint comparison. This is useful for comparing very large, very similar fingerprints.
1 parent cf9fda9 commit 147b26c

File tree

3 files changed

+26
-13
lines changed

3 files changed

+26
-13
lines changed

handlers/FingerprintHandlers.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ func StoredFingerprintSurvivalHandler(w http.ResponseWriter, r *http.Request) {
287287
func StoredFingerprintComparisonHandler(w http.ResponseWriter, r *http.Request) {
288288
f1Name := mux.Vars(r)["fingerprint"]
289289
f2Name := r.FormValue("second")
290+
includeSurvived := r.FormValue("include-survived") != "false"
290291

291292
f1Bytes, err := ioutil.ReadFile(FingerprintsDirectory() + f1Name)
292293
if err != nil {
@@ -316,7 +317,7 @@ func StoredFingerprintComparisonHandler(w http.ResponseWriter, r *http.Request)
316317
return
317318
}
318319

319-
comparison := lib.CompareFingerprints(f1, f2)
320+
comparison := lib.CompareFingerprints(f1, f2, includeSurvived)
320321
b, err := json.MarshalIndent(comparison, "", indent)
321322
if err != nil {
322323
logErrors(err, nil)

lib/CompareFingerprints.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ import (
44
"github.com/polyverse/ropoly/lib/types"
55
)
66

7-
func CompareFingerprints(f1 types.Fingerprint, f2 types.Fingerprint) types.FingerprintComparison {
8-
return f1.CompareTo(f2)
7+
func CompareFingerprints(f1, f2 types.Fingerprint, includeSurvived bool) types.FingerprintComparison {
8+
return f1.CompareTo(f2, includeSurvived)
99
}

lib/types/types.go

+22-10
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ func FingerprintFromGadgets(gadgetInstances []*GadgetInstance) (Fingerprint, err
115115
return fingerprint, nil
116116
}
117117

118-
func (f1 Fingerprint) CompareTo(f2 Fingerprint) FingerprintComparison {
118+
func (f1 Fingerprint) CompareTo(f2 Fingerprint, includeSurvived bool) FingerprintComparison {
119119
ret := FingerprintComparison{
120120
GadgetDisplacements: map[Addr]map[GadgetId][]Offset{},
121121
NewGadgets: map[GadgetId][]Addr{},
@@ -124,16 +124,28 @@ func (f1 Fingerprint) CompareTo(f2 Fingerprint) FingerprintComparison {
124124

125125
for gadget, oldAddresses := range f1 {
126126
newAddresses := f2[gadget]
127-
for i := 0; i < len(oldAddresses); i++ {
128-
oldAddress := oldAddresses[i]
129-
offsets := make([]Offset, len(newAddresses))
130-
survived := false
131-
for j, newAddress := range newAddresses {
132-
offset := Offset(newAddress) - Offset(oldAddress)
133-
if offset == 0 {
134-
survived = true
127+
newAddressIndex := 0
128+
survivedAddresses := map[Addr]bool{}
129+
for _, oldAddress := range oldAddresses {
130+
for newAddressIndex < len(newAddresses) && oldAddress > newAddresses[newAddressIndex] {
131+
newAddressIndex++
132+
}
133+
if newAddressIndex < len(newAddresses) && oldAddress == newAddresses[newAddressIndex] {
134+
survivedAddresses[oldAddress] = true
135+
}
136+
}
137+
for _, oldAddress := range oldAddresses {
138+
survived := survivedAddresses[oldAddress]
139+
if (!includeSurvived) && survived {
140+
continue
141+
}
142+
var offsets []Offset
143+
for _, newAddress := range newAddresses {
144+
if (!includeSurvived) && survivedAddresses[newAddress] {
145+
continue
135146
}
136-
offsets[j] = offset
147+
offset := Offset(newAddress) - Offset(oldAddress)
148+
offsets = append(offsets, offset)
137149
ret.GadgetsByOffset[offset]++
138150
}
139151
if survived {

0 commit comments

Comments
 (0)