[ruby-core:74965] [Ruby trunk Bug#12290] Possible segfault with Thread#name=

From: herwin@...
Date: 2016-04-15 11:23:52 UTC
List: ruby-core #74965
Issue #12290 has been updated by Herwin ..


And since it's pretty easy to get the relevant source on a running debian system:

```
int 
pthread_setname_np (th, name)
     pthread_t th;
     const char *name;
{
  const struct pthread *pd = (const struct pthread *) th;
...
#define FMT "/proc/self/task/%u/comm" 
  char fname[sizeof (FMT) + 8];
  sprintf (fname, FMT, (unsigned int) pd->tid);
```

Line 49 is the last line, and this is indeed the first part where a member of td is queried.

----------------------------------------
Bug #12290: Possible segfault with Thread#name=
https://bugs.ruby-lang.org/issues/12290#change-58091

* Author: Herwin .
* Status: Open
* Priority: Normal
* Assignee: 
* ruby -v: ruby 2.3.0p0 (2015-12-25 revision 53290)
* Backport: 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN
----------------------------------------
Ruby 2.3 added a Thread#name=, which may segfault when used incorrectly. This little program:

```
class SubClassedThread < Thread
  def initialize()
    self.name = 'foo'
    super do
      yield
    end
  end
end

SubClassedThread.new {}
```

Causes a segfault with both Ruby 2.3 (ruby 2.3.0p0 (2015-12-25 revision 53290)) and ruby-2.4.0-dev (ruby 2.4.0dev (2016-04-15 trunk 54594)). Moving the line that assignes the name in the block passed to super resolves the issue. Even thought there is a workaround, it shouldn't be possible to trigger a segfault from a script imho.

The relevant lines of the backtrace

```
/lib/i386-linux-gnu/i686/cmov/libpthread.so.0(pthread_setname_np+0x50) [0xf739ded0]
ruby(rb_thread_setname+0x95) [0xf755dc85] thread.c:2797
```

The system is a default Debian Jessie (32bit), with libc version 2.19-18+deb8u4.



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next