diff options
Diffstat (limited to 'src/osfp_score_db.c')
| -rw-r--r-- | src/osfp_score_db.c | 23 |
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; |
