aboutsummaryrefslogtreecommitdiff
path: root/lib/std/event
diff options
context:
space:
mode:
authorBill Nagel <bill@axzez.com>2021-01-11 22:21:18 -0500
committerVeikka Tuominen <git@vexu.eu>2021-02-21 12:16:48 +0200
commitcc5e5cca83cca9a1de81f98a333e8a3fcd26df0c (patch)
tree38ec9e2ea259acd91ebf821c3b209e7ece944d45 /lib/std/event
parent1bd434fd18e0cb769ca46849dac056a562ce7ce3 (diff)
downloadzig-cc5e5cca83cca9a1de81f98a333e8a3fcd26df0c.tar.gz
zig-cc5e5cca83cca9a1de81f98a333e8a3fcd26df0c.zip
fix race condition in linuxWaitFd
Diffstat (limited to 'lib/std/event')
-rw-r--r--lib/std/event/loop.zig9
1 files changed, 4 insertions, 5 deletions
diff --git a/lib/std/event/loop.zig b/lib/std/event/loop.zig
index 492b7c1758..912f99e961 100644
--- a/lib/std/event/loop.zig
+++ b/lib/std/event/loop.zig
@@ -440,13 +440,11 @@ pub const Loop = struct {
.overlapped = ResumeNode.overlapped_init,
},
};
- var need_to_delete = false;
+ var need_to_delete = true;
defer if (need_to_delete) self.linuxRemoveFd(fd);
suspend {
- if (self.linuxAddFd(fd, &resume_node.base, flags)) |_| {
- need_to_delete = true;
- } else |err| switch (err) {
+ self.linuxAddFd(fd, &resume_node.base, flags) catch |err| switch (err) {
error.FileDescriptorNotRegistered => unreachable,
error.OperationCausesCircularLoop => unreachable,
error.FileDescriptorIncompatibleWithEpoll => unreachable,
@@ -456,6 +454,7 @@ pub const Loop = struct {
error.UserResourceLimitReached,
error.Unexpected,
=> {
+ need_to_delete = false;
// Fall back to a blocking poll(). Ideally this codepath is never hit, since
// epoll should be just fine. But this is better than incorrect behavior.
var poll_flags: i16 = 0;
@@ -479,7 +478,7 @@ pub const Loop = struct {
};
resume @frame();
},
- }
+ };
}
}