77e77fb4818ecc7ca30c4203a0689a55173dcc36
The raw blocking fd had three lifecycle bugs: close() does not wake a thread blocked in recvfrom, the watchdog and the error path both closed the fd without coordination, and a closed fd number could be recycled to an unrelated connection that the lingering reader would then consume from and the second close would tear down. Wrapping the nonblocking fd in os.File gives poller-based reads that Close wakes, idempotent close, and no reuse while a read is in flight.
sing-box
The universal proxy platform.
Documentation
License
Copyright (C) 2022 by nekohasekai <contact-sagernet@sekai.icu>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
In addition, no derivative work may use the name or imply association
with this application without prior consent.
Description
Languages
Go
97.2%
Shell
1.6%
Objective-C
0.8%
Makefile
0.2%
C
0.2%