summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Staessens <[email protected]>2017-11-21 22:13:03 +0100
committerSander Vrijders <[email protected]>2017-11-22 09:57:36 +0100
commit4adbe0c39415ac0848c4a5e14733369c3bac3a0f (patch)
tree859728da8acbafae78ddd8685cbb86d140065383
parentf2a4cc5cca13ff1933b75c6fa7a1491909014ad9 (diff)
downloadouroboros-4adbe0c39415ac0848c4a5e14733369c3bac3a0f.tar.gz
ouroboros-4adbe0c39415ac0848c4a5e14733369c3bac3a0f.zip
tools: Fix SEGV in oping client
The oping client tried to cancel non-created pthreads if it was killed during flow allocation, which caused a SEGV. The threads are now stopped using a variable. Fixes bug #2. Signed-off-by: Dimitri Staessens <[email protected]> Signed-off-by: Sander Vrijders <[email protected]>
-rw-r--r--src/tools/oping/oping_client.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/tools/oping/oping_client.c b/src/tools/oping/oping_client.c
index d1d31242..451e5aa0 100644
--- a/src/tools/oping/oping_client.c
+++ b/src/tools/oping/oping_client.c
@@ -48,6 +48,8 @@
#include <errno.h>
#include <float.h>
+volatile bool stop;
+
void shutdown_client(int signo, siginfo_t * info, void * c)
{
(void) info;
@@ -57,8 +59,7 @@ void shutdown_client(int signo, siginfo_t * info, void * c)
case SIGINT:
case SIGTERM:
case SIGHUP:
- pthread_cancel(client.reader_pt);
- pthread_cancel(client.writer_pt);
+ stop = true;
default:
return;
}
@@ -79,7 +80,7 @@ void * reader(void * o)
fccntl(fd, FLOWSRCVTIMEO, &timeout);
- while (client.rcvd != client.count) {
+ while (!stop && client.rcvd != client.count) {
msg_len = flow_read(fd, buf, OPING_BUF_SIZE);
if (msg_len == -ETIMEDOUT)
break;
@@ -149,7 +150,7 @@ void * writer(void * o)
pthread_cleanup_push((void (*) (void *)) free, buf);
- while (client.sent < client.count) {
+ while (!stop && client.sent < client.count) {
nanosleep(&wait, NULL);
clock_gettime(CLOCK_MONOTONIC, &now);
@@ -174,6 +175,7 @@ void * writer(void * o)
static int client_init(void)
{
+ stop = false;
client.sent = 0;
client.rcvd = 0;
client.rtt_min = FLT_MAX;
@@ -228,6 +230,8 @@ static int client_main(void)
pthread_create(&client.writer_pt, NULL, writer, &fd);
pthread_join(client.writer_pt, NULL);
+
+ pthread_cancel(client.reader_pt);
pthread_join(client.reader_pt, NULL);
clock_gettime(CLOCK_REALTIME, &toc);