fix: check packet conformity rigth
This commit is contained in:
20
src/main.c
20
src/main.c
@@ -140,11 +140,13 @@ static int preload(struct setting const *settings, int sockfd, char const *packe
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int check_reply(struct sockaddr_in const *me, struct sockaddr_in const *sender, char *sent, char *received, size_t packet_size)
|
static int check_reply(struct sockaddr_in const *me, struct sockaddr_in const *sender, char *sent, char *received, size_t sent_size, size_t recv_size)
|
||||||
{
|
{
|
||||||
|
if (sent_size != recv_size)
|
||||||
|
return 0;
|
||||||
if (((struct icmphdr *)sent)->type != 0)
|
if (((struct icmphdr *)sent)->type != 0)
|
||||||
return 0;
|
return 0;
|
||||||
if (check_packet_conformity(sent, received, packet_size))
|
if (check_packet_conformity(sent, received, sent_size))
|
||||||
return 1;
|
return 1;
|
||||||
return memcmp(sender, me, sizeof(struct sockaddr_in));
|
return memcmp(sender, me, sizeof(struct sockaddr_in));
|
||||||
}
|
}
|
||||||
@@ -207,19 +209,15 @@ int main(int ac, char **av)
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
ret = recvfrom(sockfd, buffer, recv_packet_size, 0, (struct sockaddr *) &sender, &len);
|
ret = recvfrom(sockfd, buffer, recv_packet_size, 0, (struct sockaddr *) &sender, &len);
|
||||||
if (ret < 0)
|
|
||||||
{
|
|
||||||
print_err("error: receive packet failed.%zd", ret);
|
|
||||||
goto error3;
|
|
||||||
}
|
|
||||||
gettimeofday(&stop, NULL);
|
gettimeofday(&stop, NULL);
|
||||||
}
|
}
|
||||||
while (check_reply(&settings.dest.ip, &sender, packet, buffer + sizeof(struct iphdr), packet_size));
|
while (ret >= 0 && check_reply(&settings.dest.ip, &sender, packet, buffer + sizeof(struct iphdr), packet_size, ret));
|
||||||
|
|
||||||
if (((struct icmphdr *) buffer + sizeof(struct iphdr))->type == 0)
|
if (ret >= (ssize_t) sizeof(struct icmphdr) && ((struct icmphdr *) buffer + sizeof(struct iphdr))->type == 0)
|
||||||
|
{
|
||||||
stats.packets_received++;
|
stats.packets_received++;
|
||||||
|
print_recv(&settings, (struct icmphdr*) (buffer + sizeof(struct iphdr)), &start, &stop, &sender);
|
||||||
print_recv(&settings, (struct icmphdr*) (buffer + sizeof(struct iphdr)), &start, &stop, &sender);
|
}
|
||||||
|
|
||||||
sleep(1);
|
sleep(1);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user