summaryrefslogtreecommitdiff
path: root/src/osfp_score_db.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/osfp_score_db.c')
-rw-r--r--src/osfp_score_db.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/osfp_score_db.c b/src/osfp_score_db.c
index 6267163..88a3bea 100644
--- a/src/osfp_score_db.c
+++ b/src/osfp_score_db.c
@@ -269,6 +269,9 @@ static int osfp_score_db_load_entry(struct osfp_score_db *score_db, cJSON *entry
element->fp = fp;
element->os_class = os_class;
HASH_ADD_KEYPTR(hh, score_db->prefilter_head, fp->value_buffer, fp->value_buffer_used, element);
+ } else {
+ // TODO: same fingerprints with different os should not insert into prefilter hash table, now just tag
+ element->repeated++;
}
// field score db
@@ -414,18 +417,34 @@ exit:
int osfp_score_db_prefilter(struct osfp_score_db *score_db, struct osfp_fingerprint *fp, struct osfp_os_class_score *result_score)
{
- int ret;
+ int ret, i;
+ unsigned int value_buffer_used = 0;
+ char value_buffer[OSFP_FINGERPRINT_VALUE_BUFFER_MAX];
struct osfp_prefilter_hash_element *element = NULL;
if (score_db->prefilter_head == NULL) {
return 0;
}
- HASH_FIND(hh, score_db->prefilter_head, fp->value_buffer, fp->value_buffer_used, element);
+ for (i = 0; i < OSFP_FIELD_OS; i++) {
+ if (0 == osfp_fingerprint_get_field_enabled(i)) {
+ continue;
+ }
+ if (fp->fields[i].value && fp->fields[i].value_len != 0) {
+ memcpy(value_buffer + value_buffer_used, fp->fields[i].value, fp->fields[i].value_len);
+ value_buffer_used += fp->fields[i].value_len;
+ }
+ }
+
+ HASH_FIND(hh, score_db->prefilter_head, value_buffer, value_buffer_used, element);
if (element == NULL) {
return 0;
}
+ if (element->repeated) {
+ return 0;
+ }
+
memset(result_score, 0, sizeof(struct osfp_os_class_score));
result_score->scores[element->os_class] = OSFP_PERCENTILE;