From 8baac06f7fedb99eabaf94e6880d241bc3bafd37 Mon Sep 17 00:00:00 2001
From: Mark Pizzolato <mark@infocomm.com>
Date: Sat, 3 Jun 2017 08:56:51 -0700
Subject: [PATCH] TAPE: Fix potential race (Coverity)

---
 sim_tape.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/sim_tape.c b/sim_tape.c
index 7c2ffe2c..28d20619 100644
--- a/sim_tape.c
+++ b/sim_tape.c
@@ -322,10 +322,19 @@ sim_debug (ctx->dbit, ctx->dptr, "_tape_completion_dispatch(unit=%d, top=%d, cal
 if (ctx->io_top != TOP_DONE)
     abort();                                            /* horribly wrong, stop */
 
-if (ctx->callback && ctx->io_top == TOP_DONE) {
+if (ctx->asynch_io)
+    pthread_mutex_lock (&ctx->io_lock);
+
+if (ctx->callback) {
     ctx->callback = NULL;
+    if (ctx->asynch_io)
+        pthread_mutex_unlock (&ctx->io_lock);
     callback (uptr, ctx->io_status);
     }
+else {
+    if (ctx->asynch_io)
+        pthread_mutex_unlock (&ctx->io_lock);
+    }
 }
 
 static t_bool _tape_is_active (UNIT *uptr)