diff --git a/include/Host.h b/include/Host.h index 7adf682724..72d2de0800 100644 --- a/include/Host.h +++ b/include/Host.h @@ -35,7 +35,10 @@ class Host : public GenericHashEntry { time_t last_stats_reset; /* Host data: update Host::deleteHostData when adding new fields */ - char *symbolic_name; /* write protected by mutex */ + struct { + char *symbolic_name; /* write protected by mutex */ + } names; + char *mdns_info; char *ssdpLocation; bool host_label_set; @@ -142,7 +145,7 @@ class Host : public GenericHashEntry { inline u_int8_t* get_mac() { return(mac ? mac->get_mac() : NULL); } inline Mac* getMac() { return(mac); } virtual char * get_os(char * const buf, ssize_t buf_len) const; - inline char* get_name() { return(symbolic_name); } + inline char* get_name() { return(names.symbolic_name); } #ifdef NTOPNG_PRO inline TrafficShaper *get_ingress_shaper(ndpi_protocol ndpiProtocol) { return(get_shaper(ndpiProtocol, true)); } inline TrafficShaper *get_egress_shaper(ndpi_protocol ndpiProtocol) { return(get_shaper(ndpiProtocol, false)); } diff --git a/src/Host.cpp b/src/Host.cpp index 1fa40b9c94..dbe8c1bfcf 100644 --- a/src/Host.cpp +++ b/src/Host.cpp @@ -66,7 +66,7 @@ Host::~Host() { #endif - if(symbolic_name) free(symbolic_name); + if(names.symbolic_name) free(names.symbolic_name); if(ssdpLocation) free(ssdpLocation); if(m) delete m; if(flow_alert_counter) delete flow_alert_counter; @@ -156,8 +156,10 @@ void Host::initialize(Mac *_mac, u_int16_t _vlanId, bool init_all) { good_low_flow_detected = false; nextResolveAttempt = 0, mdns_info = NULL; host_label_set = false; - num_uses = 0, symbolic_name = NULL, vlan_id = _vlanId % MAX_NUM_VLAN, + num_uses = 0, vlan_id = _vlanId % MAX_NUM_VLAN, first_seen = last_seen = iface->getTimeLastPktRcvd(); + memset(&names, 0, sizeof(names)); + if((m = new(std::nothrow) Mutex()) == NULL) ntop->getTrace()->traceEvent(TRACE_WARNING, "Internal error: NULL mutex. Are you running out of memory?"); @@ -534,7 +536,7 @@ void Host::lua(lua_State* vm, AddressTree *ptree, This has been disabled as in case of an attack, most hosts do not have a name and we will waste a lot of time doing activities that are not necessary */ - if((symbolic_name == NULL) || (strcmp(symbolic_name, ipaddr) == 0)) { + if((names.symbolic_name == NULL) || (strcmp(names.symbolic_name, ipaddr) == 0)) { /* We resolve immediately the IP address by queueing on the top of address queue */ ntop->getRedis()->pushHostToResolve(ipaddr, false, true /* Fake to resolve it ASAP */); @@ -597,9 +599,9 @@ void Host::lua(lua_State* vm, AddressTree *ptree, */ void Host::setName(char *name) { if(m) m->lock(__FILE__, __LINE__); - if((symbolic_name == NULL) || (symbolic_name && strcmp(symbolic_name, name))) { - if(symbolic_name) free(symbolic_name); - symbolic_name = strdup(name); + if((names.symbolic_name == NULL) || (names.symbolic_name && strcmp(names.symbolic_name, name))) { + if(names.symbolic_name) free(names.symbolic_name); + names.symbolic_name = strdup(name); } if(m) m->unlock(__FILE__, __LINE__); @@ -614,17 +616,17 @@ char* Host::get_name(char *buf, u_int buf_len, bool force_resolution_if_not_foun if(nextResolveAttempt && ((num_resolve_attempts > 1) || (nextResolveAttempt > now) || (nextResolveAttempt == (time_t)-1))) { - return(symbolic_name); + return(names.symbolic_name); } else nextResolveAttempt = ntop->getPrefs()->is_dns_resolution_enabled() ? now + MIN_HOST_RESOLUTION_FREQUENCY : (time_t)-1; num_resolve_attempts++; addr = ip.print(buf, buf_len); - if((symbolic_name != NULL) && strcmp(symbolic_name, addr)) - return(symbolic_name); + if((names.symbolic_name != NULL) && strcmp(names.symbolic_name, addr)) + return(names.symbolic_name); - if(readDHCPCache() && symbolic_name) return(symbolic_name); + if(readDHCPCache() && names.symbolic_name) return(names.symbolic_name); rc = ntop->getRedis()->getAddress(addr, redis_buf, sizeof(redis_buf), force_resolution_if_not_found); @@ -634,7 +636,7 @@ char* Host::get_name(char *buf, u_int buf_len, bool force_resolution_if_not_foun else setName(addr); - return(symbolic_name); + return(names.symbolic_name); } /* ***************************************** */ @@ -722,7 +724,7 @@ json_object* Host::getJSONObject(DetailsLevel details_level) { json_object_object_add(my_object, "seen.last", json_object_new_int64(last_seen)); json_object_object_add(my_object, "last_stats_reset", json_object_new_int64(last_stats_reset)); json_object_object_add(my_object, "asn", json_object_new_int(asn)); - if(symbolic_name) json_object_object_add(my_object, "symbolic_name", json_object_new_string(symbolic_name)); + if(names.symbolic_name) json_object_object_add(my_object, "symbolic_name", json_object_new_string(names.symbolic_name)); if(asname) json_object_object_add(my_object, "asname", json_object_new_string(asname ? asname : (char*)"")); get_os(buf, sizeof(buf)); if(strlen(buf)) json_object_object_add(my_object, "os", json_object_new_string(buf)); diff --git a/src/LocalHost.cpp b/src/LocalHost.cpp index ec3620744a..ec62aec9d9 100644 --- a/src/LocalHost.cpp +++ b/src/LocalHost.cpp @@ -195,8 +195,12 @@ bool LocalHost::deserialize(char *json_str, char *key) { if(json_object_object_get_ex(o, "seen.last", &obj)) last_seen = json_object_get_int64(obj); if(json_object_object_get_ex(o, "last_stats_reset", &obj)) last_stats_reset = json_object_get_int64(obj); - if(json_object_object_get_ex(o, "symbolic_name", &obj)) { if(symbolic_name) free(symbolic_name); symbolic_name = strdup(json_object_get_string(obj)); } - if(json_object_object_get_ex(o, "os", &obj)) { inlineSetOS(json_object_get_string(obj)); } + if(json_object_object_get_ex(o, "symbolic_name", &obj)) { + if(names.symbolic_name) free(names.symbolic_name); + names.symbolic_name = strdup(json_object_get_string(obj)); + } + if(json_object_object_get_ex(o, "os", &obj)) + inlineSetOS(json_object_get_string(obj)); /* We commented the line below to avoid strings too long */ #if 0