if (!is_valid(sa.sin_addr.s_addr) || sa.sin_port != port)
{
- syslog(LOG_WARNING, "Received packet from invalid source %s.%d", inet_ntoa(sa.sin_addr), ntohs(sa.sin_port));
+ syslog(LOG_WARNING, "Received packet from invalid source %s:%d", inet_ntoa(sa.sin_addr), ntohs(sa.sin_port));
return;
}
- if (r < n || r != n + ntohl(pkt.num_users)*sizeof(struct userinfo))
+ if (r < n ||
+ pkt.magic != htonl(NWHO_MAGIC) ||
+ ntohl(pkt.num_users) > MAX_USERS ||
+ r != n + ntohl(pkt.num_users)*sizeof(struct userinfo))
{
syslog(LOG_WARNING, "Malformed packet from %s", inet_ntoa(sa.sin_addr));
return;
}
- if (pkt.magic != htonl(NWHO_MAGIC))
- {
- syslog(LOG_WARNING, "Received ancient nwho packet from %s", inet_ntoa(sa.sin_addr));
- return;
- }
-
for(e=first_host; e; e=e->next)
if (e->addr == sa.sin_addr.s_addr)
break;
+
if (!e)
{
e = malloc(sizeof(struct hostrec));
h = gethostbyaddr((char *) &sa.sin_addr, sizeof(sa.sin_addr), AF_INET);
if (h)
{
- sprintf(e->name, "%.30s", h->h_name);
- for(c=e->name; *c; c++)
+ snprintf(e->name, sizeof(e->name), "%s", h->h_name);
+ for (c=e->name; *c; c++)
if (*c == '.')
{
*c = 0;