Re: [patch v1] nptl: namespace-safe pthread keys implementation

Florian Weimer <[email protected]>
Newsgroups gmane.comp.lib.glibc.alpha
Message-ID <[email protected]>
* Adhemerval Zanella Netto:

> The old design stored a generation sequence number in both the global
> slot and the per-thread slot (KEY_UNUSED and KEY_USABLE). When a key
> was deleted and its slot reused, per-thread values from the old key
> failed the sequence-number check in pthread_getspecific and
> deallocate_tsd, and were silently ignored.
>
> This new design replaces this with something like zero existing
> per-thread slots at key creation. It is seems somewhat weaker:
>
> * a thread calling pthread_setspecific(K, v) reads the global slot
>   (outside any lock) to validate K, then writes its per-thread
>   slot. Between those two steps, another thread can delete K and a third
>   thread can create a new key that reuses the same slot.  The first
>   thread's write then silently deposits a value for the new key.

But the old scheme has the same problem?  It's already use-after-free on
K if it's used after pthread_key_delete.

> * __nptl_deallocate_tsd reads the global destructor and the per-thread
>   value with no synchronisation between them.  If the key is deleted and
>   reused between those two reads, the wrong destructor may be called
>   with the wrong value.
>
>
> I think either it will need to keep the generation counter or add
> synchronization between pthread_setspecific and rely on delete-time
> zeroing. The extra synchronization adds more synchronization what
> should be fast-path, so I am not sure which one is preferable.

A simple scheme does not immediately come to my mind.

We could perhaps use an rwlock.  I'm not sure if we need to hold a lock
while the destructors are running.  It looks to me glibc is only
responsible for avoiding calling the wrong destructor/value combination,
not that no destructors are called after pthread_key_delete returns.

Thanks,
Florian
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.