X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=windows%2Fwinhandl.c;h=e5a5e2d541aea5c00848bd8d314fd33a65f50636;hb=9f9d72ec58642e91b4f93ee4405a8086ee2fb2f0;hp=4746d1b4b55425b6f0c7b290940849209e6f00aa;hpb=f2e61275f229b5eefb7a4375b3025a0b5554089a;p=PuTTY.git diff --git a/windows/winhandl.c b/windows/winhandl.c index 4746d1b4..e5a5e2d5 100644 --- a/windows/winhandl.c +++ b/windows/winhandl.c @@ -579,17 +579,18 @@ static void handle_destroy(struct handle *h) void handle_free(struct handle *h) { - /* - * If the handle is currently busy, we cannot immediately free - * it. Instead we must wait until it's finished its current - * operation, because otherwise the subthread will write to - * invalid memory after we free its context from under it. - */ assert(h && !h->u.g.moribund); - if (h->u.g.busy) { - /* - * Just set the moribund flag, which will be noticed next - * time an operation completes. + if (h->u.g.busy && h->type != HT_FOREIGN) { + /* + * If the handle is currently busy, we cannot immediately free + * it, because its subthread is in the middle of something. + * (Exception: foreign handles don't have a subthread.) + * + * Instead we must wait until it's finished its current + * operation, because otherwise the subthread will write to + * invalid memory after we free its context from under it. So + * we set the moribund flag, which will be noticed next time + * an operation completes. */ h->u.g.moribund = TRUE; } else if (h->u.g.defunct) {