瀏覽代碼

recheck cancellation disabled flag after syscall returns EINTR

we already checked before making the syscall, but it's possible that a
signal handler interrupted the blocking syscall and disabled
cancellation, and that this is the cause of EINTR. in this case, the
old behavior was testably wrong.
Rich Felker 14 年之前
父節點
當前提交
be2e06d347
共有 1 個文件被更改,包括 1 次插入1 次删除
  1. 1 1
      src/thread/cancel_impl.c

+ 1 - 1
src/thread/cancel_impl.c

@@ -27,7 +27,7 @@ long (__syscall_cp)(long nr, long u, long v, long w, long x, long y, long z)
 	r = __syscall_cp_asm(&self->cp_sp, nr, u, v, w, x, y, z);
 	self->cp_ip = old_ip;
 	self->cp_sp = old_sp;
-	if (r == -EINTR && self->cancel) __cancel();
+	if (r == -EINTR && self->cancel && !self->canceldisable) __cancel();
 	return r;
 }