Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <CAA3hR4cSZvf5P7-jYL+ZHrWX9EBrdpRUi36MaV9p7o1yRKGp5w@mail.gmail.com>
Date: Thu, 11 Oct 2018 17:14:59 +0200
From: Rabbitstack <rabbitstack7@...il.com>
To: Rich Felker <dalias@...c.org>
Cc: musl@...ts.openwall.com
Subject: Re: setrlimit hangs the process

Hi

I managed to reproduce the problem with minimal code snippet and can
confirm it's definitely the Go stdlib signal handler that messes things up.
Here's the code:

package main

import (

   bpflib "github.com/iovisor/gobpf/elf"
   "os/signal"
   "os"
   "fmt"
)

func main() {
   sig := make(chan os.Signal)
   signal.Notify(sig, os.Kill, os.Interrupt)

   mod := bpflib.NewModule("/tmp/sched.o")
   fmt.Println("loading ebpf module")
   err := mod.Load(nil)
   if err != nil {
      panic(err)
   }
   err = mod.EnableKprobes(50)
   if err != nil {
      panic(err)
   }
   fmt.Println("loaded ebpf module")
   rxChan := make(chan []byte)
   lostChan := make(chan uint64)

   pmap, err := bpflib.InitPerfMap(
      mod,
      "sched",
      rxChan,
      lostChan,
   )

   if err != nil {
      panic(err)
   }

   go func() {
      for {
         select {
         case pe := <-rxChan:
            fmt.Println(pe)
         case l := <-lostChan:
            fmt.Println(l)
         }
      }
   }()
   pmap.PollStart()
   fmt.Println("listening on ebpf map")
   <-sig
}

The main thread hangs right after the call to module constructor.


On Tue, Oct 9, 2018 at 10:40 PM Rich Felker <dalias@...c.org> wrote:

> On Tue, Oct 09, 2018 at 10:36:41PM +0200, Szabolcs Nagy wrote:
> > * Rabbitstack <rabbitstack7@...il.com> [2018-10-09 21:37:06 +0200]:
> > >  Should we raise an issue in Go upstream repository since there is
> nothing
> > > actionable from musl side?
> > >
> >
> > have you figured out where the siprocmask came from?
> > it might not be the go runtime but some c lib that you linked in.
>
> Well the sigset_t was created in Go code or via some other code that
> bypasses libc. The libc functions cannot create a sigset_t with the
> implementation-internal signals masked.
>
> > > El vie., 5 oct. 2018 2:47, Rich Felker <dalias@...c.org> escribió:
> > > > >
> > > > > Here is the bug:
> > > > >
> > > > > 6208  rt_sigprocmask(SIG_SETMASK, ~[HUP INT QUIT ILL TRAP ABRT BUS
> FPE
> > > > SEGV TERM STKFLT CHLD PROF SYS RTMIN RT_1],  <unfinished ...>
> >
> > the go runtime should not make this call, it probably comes from
> > somewhere else.
> >
> > i think you should try to create a minimal reproducer go code
> > that makes this syscall.
>
> I looked at the Go implementations of the functions for sigset_t
> manipulation and sigprocmask. They all bypass libc. So either it's an
> error to use them at all in programs that link with libc, or a bug in
> Go that they don't respect SIGRTMIN, etc.
>
> Rich
>

Content of type "text/html" skipped

Download attachment "sched.o" of type "application/octet-stream" (7560 bytes)

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.