diff --git a/apps/app_mixmonitor.c b/apps/app_mixmonitor.c
index 9911bc4ecc8d6a719751b16b8a055fe062a33430..bb1bc51d0c8338428aaf8afbda4f79907b13a263 100644
--- a/apps/app_mixmonitor.c
+++ b/apps/app_mixmonitor.c
@@ -990,6 +990,7 @@ static int launch_monitor_thread(struct ast_channel *chan, const char *filename,
 	if (startmon(chan, &mixmonitor->audiohook)) {
 		ast_log(LOG_WARNING, "Unable to add '%s' spy to channel '%s'\n",
 			mixmonitor_spy_type, ast_channel_name(chan));
+		ast_autochan_destroy(mixmonitor->autochan);
 		ast_audiohook_destroy(&mixmonitor->audiohook);
 		mixmonitor_free(mixmonitor);
 		return -1;
diff --git a/main/audiohook.c b/main/audiohook.c
index 4db32ea7c0de0222150306e4d46a4f9e80bece3f..ed16897be05de03e398b5688d74f025a6bcd9aaf 100644
--- a/main/audiohook.c
+++ b/main/audiohook.c
@@ -502,6 +502,15 @@ int ast_audiohook_attach(struct ast_channel *chan, struct ast_audiohook *audioho
 {
 	ast_channel_lock(chan);
 
+	/* Don't allow an audiohook to be attached to a channel that is already hung up.
+	 * The hang up process is what actually notifies the audiohook that it should
+	 * stop.
+	 */
+	if (ast_test_flag(ast_channel_flags(chan), AST_FLAG_ZOMBIE)) {
+		ast_channel_unlock(chan);
+		return -1;
+	}
+
 	if (!ast_channel_audiohooks(chan)) {
 		struct ast_audiohook_list *ahlist;
 		/* Whoops... allocate a new structure */