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)