rootlessport: use two different channels
The same channel is written to by two different goroutines. Use a different channel for each of them so to avoid writing to a closed channel. Closes: https://github.com/containers/libpod/issues/6018 Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
This commit is contained in:
parent
b8db112436
commit
6d545bb2f7
|
|
@ -102,25 +102,27 @@ func parent() error {
|
|||
return err
|
||||
}
|
||||
|
||||
sigC := make(chan os.Signal, 1)
|
||||
signal.Notify(sigC, unix.SIGPIPE)
|
||||
defer func() {
|
||||
// dummy signal to terminate the goroutine
|
||||
sigC <- unix.SIGKILL
|
||||
}()
|
||||
exitC := make(chan os.Signal, 1)
|
||||
defer close(exitC)
|
||||
|
||||
go func() {
|
||||
sigC := make(chan os.Signal, 1)
|
||||
signal.Notify(sigC, unix.SIGPIPE)
|
||||
defer func() {
|
||||
signal.Stop(sigC)
|
||||
close(sigC)
|
||||
}()
|
||||
|
||||
s := <-sigC
|
||||
if s == unix.SIGPIPE {
|
||||
if f, err := os.OpenFile("/dev/null", os.O_WRONLY, 0755); err == nil {
|
||||
unix.Dup2(int(f.Fd()), 1) // nolint:errcheck
|
||||
unix.Dup2(int(f.Fd()), 2) // nolint:errcheck
|
||||
f.Close()
|
||||
select {
|
||||
case s := <-sigC:
|
||||
if s == unix.SIGPIPE {
|
||||
if f, err := os.OpenFile("/dev/null", os.O_WRONLY, 0755); err == nil {
|
||||
unix.Dup2(int(f.Fd()), 1) // nolint:errcheck
|
||||
unix.Dup2(int(f.Fd()), 2) // nolint:errcheck
|
||||
f.Close()
|
||||
}
|
||||
}
|
||||
case <-exitC:
|
||||
}
|
||||
}()
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue