[PATCH] Async signal safe TLS accesses
Paul Pluzhnikov
ppluzhnikov@google.com
Fri Jan 3 02:49:00 GMT 2014
On Thu, Jan 2, 2014 at 11:04 AM, Andrew Hunter <ahh@google.com> wrote:
> This is version 6 of the patch, containing:
There were still some new build warnings generated, which I fixed ...
> @@ -114,8 +143,17 @@ void
> internal_function __attribute_noinline__
> _dl_allocate_static_tls (struct link_map *map)
> {
> - if (map->l_tls_offset == FORCED_DYNAMIC_TLS_OFFSET
> - || _dl_try_allocate_static_tls (map))
> + /* We wrap this in a signal mask because it has to iterate all threads
> + (including this one) and update this map's TLS entry. A signal handler
> + accessing TLS would try to do the same update and break. */
> + sigset_t old;
> + _dl_mask_all_signals (&old);
> + int err = -1;
> + if (map->l_tls_offset != FORCED_DYNAMIC_TLS_OFFSET)
> + err = _dl_try_allocate_static_tls (map);
> +
> + _dl_unmask_signals (&old);
> + if (err != 0)
> {
> _dl_signal_error (0, map->l_name, NULL, N_("\
> cannot allocate memory in static TLS block"));
This one looks like a possible bug to me:
it will always error if map->l_tls_offset == FORCED_DYNAMIC_TLS_OFFSET.
Shouldn't it be 'int err = 0;' ?
Thanks,
--
Paul Pluzhnikov
More information about the Libc-alpha
mailing list