diff options
| author | Bill Nagel <bill@axzez.com> | 2021-01-11 22:21:18 -0500 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2021-02-21 12:16:48 +0200 |
| commit | cc5e5cca83cca9a1de81f98a333e8a3fcd26df0c (patch) | |
| tree | 38ec9e2ea259acd91ebf821c3b209e7ece944d45 /lib/std/event | |
| parent | 1bd434fd18e0cb769ca46849dac056a562ce7ce3 (diff) | |
| download | zig-cc5e5cca83cca9a1de81f98a333e8a3fcd26df0c.tar.gz zig-cc5e5cca83cca9a1de81f98a333e8a3fcd26df0c.zip | |
fix race condition in linuxWaitFd
Diffstat (limited to 'lib/std/event')
| -rw-r--r-- | lib/std/event/loop.zig | 9 |
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(); }, - } + }; } } |
