aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2020-02-22 13:24:30 +0200
committerSergey Poznyakoff <gray@gnu.org>2020-02-22 13:24:30 +0200
commit69bc53b8aa9ce26329603ac25f7cfb5d028845dc (patch)
tree6fa96599846b4259780b28e20e839204015a0237 /src
parentc15bf2380377abf2e8abb91892eb172d5062d75c (diff)
downloadping903-69bc53b8aa9ce26329603ac25f7cfb5d028845dc.tar.gz
ping903-69bc53b8aa9ce26329603ac25f7cfb5d028845dc.tar.bz2
Protect each hostaddr with a mutex
Diffstat (limited to 'src')
-rw-r--r--src/config.c1
-rw-r--r--src/ping903.h3
-rw-r--r--src/pinger.c23
3 files changed, 24 insertions, 3 deletions
diff --git a/src/config.c b/src/config.c
index d382c95..838984d 100644
--- a/src/config.c
+++ b/src/config.c
@@ -119,6 +119,7 @@ cf_ip_list(int mode, union cf_callback_arg *arg, void *data)
hostaddr[hostaddr_count].addr = emalloc(res->ai_addrlen);
memcpy(hostaddr[hostaddr_count].addr, res->ai_addr, res->ai_addrlen);
hostaddr[hostaddr_count].addrlen = res->ai_addrlen;
+ pthread_mutex_init(&hostaddr[hostaddr_count].mutex, NULL);
hostaddr_count++;
freeaddrinfo(res);
}
diff --git a/src/ping903.h b/src/ping903.h
index 52ed6c1..57fc22a 100644
--- a/src/ping903.h
+++ b/src/ping903.h
@@ -90,8 +90,7 @@ typedef struct hostaddr {
struct sockaddr *addr;
socklen_t addrlen;
- /* Send queue */
- struct hostaddr *next;
+ pthread_mutex_t mutex;
/* Current ping statistics */
struct timeval start_tv;
diff --git a/src/pinger.c b/src/pinger.c
index cbc80d2..1e91180 100644
--- a/src/pinger.c
+++ b/src/pinger.c
@@ -95,6 +95,18 @@ seqno_alloc(HOSTADDR *addr, struct timeval *tv)
return -1;
}
+static inline void
+hostaddr_lock(HOSTADDR *host)
+{
+ pthread_mutex_lock(&host->mutex);
+}
+
+static inline void
+hostaddr_unlock(HOSTADDR *host)
+{
+ pthread_mutex_unlock(&host->mutex);
+}
+
static HOSTADDR *
hostaddr_from_seqno(int seq)
{
@@ -102,6 +114,7 @@ hostaddr_from_seqno(int seq)
if (seqidx[seq].replied)
info("%s:%d: DUP!", host->name, seq);
seqidx[seq].replied++;
+ hostaddr_lock(host);
return host;
}
@@ -220,8 +233,11 @@ send_echo(HOSTADDR *host, unsigned char *ping_buffer)
size_t buflen;
ssize_t n;
int seqno;
-
+
+ hostaddr_lock(host);
gettimeofday(&host->xmit_tv, NULL);
+ hostaddr_unlock(host);
+
memcpy(icmp->icmp_data, &host->xmit_tv, sizeof(host->xmit_tv));
if (data_buffer)
memcpy(icmp->icmp_data + sizeof(host->xmit_tv), data_buffer,
@@ -245,9 +261,11 @@ send_echo(HOSTADDR *host, unsigned char *ping_buffer)
if (n < 0) {
error("%s: sendto: %s", host->name, strerror(errno));
} else {
+ hostaddr_lock(host);
if (host->xmit_count == 0)
host->start_tv = host->xmit_tv;
host->xmit_count++;
+ hostaddr_unlock(host);
xmit_total++;
if (n != buflen)
error("ping: wrote %s %d chars, ret=%d\n",
@@ -412,6 +430,7 @@ host_stat_commit(HOSTADDR *host)
static void
host_reset(HOSTADDR *host)
{
+ hostaddr_lock(host);
if (host->xmit_count > 0)
host_stat_commit(host);
host->xmit_count = 0;
@@ -432,6 +451,7 @@ host_reset(HOSTADDR *host)
case HOST_STAT_INVALID:
break;
}
+ hostaddr_unlock(host);
}
static inline double
@@ -767,6 +787,7 @@ p903_receiver(void *p)
icmp, ip, n, rtt);
if (host->recv_count == ping_count)
host_stat_commit(host);
+ hostaddr_unlock(host);
} else
fatal("no host found for sequence number %d",
icmp->icmp_seq);

Return to:

Send suggestions and report system problems to the System administrator.