mailing list of musl libc
 help / color / mirror / code / Atom feed
From: Rich Felker <dalias@libc.org>
To: musl@lists.openwall.com
Subject: Re: musl 1.0.x branch
Date: Wed, 11 Jun 2014 09:09:37 -0400	[thread overview]
Message-ID: <20140611130937.GR179@brightrain.aerifal.cx> (raw)
In-Reply-To: <20140611102314.GI20596@example.net>

On Wed, Jun 11, 2014 at 12:24:19PM +0200, u-igbb@aetey.se wrote:
> > In any case, it's also a matter of maintenance cost. Supporting
> > environment variables to override these things is not always trivial.
> > Some (most?) of these interfaces are required to be thread-safe and
> > accessing the environment is not thread-safe with respect to other
> > threads modifying it. There may also be storage/allocation burdens
> 
> Do you mean that getenv("SOMETHING") can be screwed if a different
> thread is doing setenv("SOMETHINGELSE",...) at a wrong time?

Indeed. In POSIX, being non-thread-safe (which setenv is) is a very
strong condition: it allows behaviors such as the above. Also note
that you can modify the environment via extern char **environ, and in
fact doing so with (compiler-specific or C11) atomics is the only safe
way to modify the environment in a multithreaded program.

> (This "SOMETHING"'s value is _not_ to be modified under the lifetime of
> the process.)

Indeed, but the environment could otherwise be modified.

XSH 2.9.1 Thread-Safety reads:

"Since multi-threaded applications are not allowed to use the environ
variable to access or modify any environment variable while any other
thread is concurrently modifying any environment variable, any
function dependent on any environment variable is not thread-safe if
another thread is modifying the environment; see XSH exec."

This makes "dependent on an environment variable" a formal property of
standard interfaces which introduces subtle breakage if/when a
function which is not specified to be dependent on an environment
variable actually uses one. The only safe solution I know to this
problem is to do the environment processing at program start time.

> > when allowing a custom runtime path requires concatenating it with
> > another string. Even if none of this were difficult, it's extra
> 
> An unmodified program can be impossible to compile against the
> modified libc as we do it, as certain macros become no longer constants
> but expressions to evaluate at run time. This is of course expected.

Hopefully this only affects programs using paths.h or similar, which
are legacy mess I just left around because it sometimes helps build
programs which are otherwise a pain to build.

> > > We solve this pretty straightforwardly by using environment variables,
> > > pointing to a relevant "shadow" file and/or pam configurations.
> > 
> > Note that the "tcb shadow" support in musl already provides this
> > functionality. For your purposes, of course, you already have path
> > override so it makes sense just to use the same tool you're using for
> > everything else. But for other uses outside yours, tcb shadow is a
> > really nice solution to this problem.
> 
> Yes I looked at it - it is unfortunately also a solution for goals
> "other than ours". AFAICS it still assumes a hardcoded database
> placement (/etc/tcb).

Yes. I suppose it wouldn't fundamentally have to do so, since programs
authenticating user accounts would be configured to the right location
for the system user database, but it seems safest (and of course
simplest) to always use that location anyway.

> In this sence it is orthogonal to what we do, we
> may choose to use it for its nice virtues but we still need to be able
> to point out the necessary tcb shadow database instance per process,
> not per compiled binary.

Yes. BTW your approach is also very nice from a unit-testing
perspective. It's hard to test things like dns resolver, user
database, etc. due to the difficulty of mocking in controlled
configurations for them. Modern Linux does however provide user
namespaces / mount namespaces which allow doing this, and that's
probably what we'll use for testing at least in the short-term (it
also makes it easy to apply the tests to other libcs).

Rich


  reply	other threads:[~2014-06-11 13:09 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-06 17:56 Rich Felker
2014-06-06 19:39 ` u-igbb
2014-06-07  6:23   ` Kevin Bortis
2014-06-07 13:16 ` Anthony G. Basile
2014-06-07 18:26 ` Gustavo Zacarias
2014-06-09  9:23 ` Natanael Copa
2014-06-09 20:08   ` Rich Felker
2014-06-10  9:43     ` u-igbb
2014-06-10 16:03       ` Rich Felker
2014-06-10 16:50         ` Laurent Bercot
2014-06-10 17:37           ` Rich Felker
2014-06-10 19:19             ` Laurent Bercot
2014-06-10 21:01               ` Rich Felker
2014-06-11  1:27                 ` Laurent Bercot
2014-06-10 20:32         ` u-igbb
2014-06-10 21:51           ` Rich Felker
2014-06-11 10:24             ` u-igbb
2014-06-11 13:09               ` Rich Felker [this message]
2014-06-11 14:37                 ` u-igbb
2014-06-10 21:25         ` Natanael Copa
2014-06-10 21:13           ` musl 1.0.x branch -- OT u-igbb
2014-06-10 21:55           ` musl 1.0.x branch Rich Felker
2014-06-11 10:41 ` Oliver Schneider
2014-06-11 13:16   ` Rich Felker
2014-06-12 18:46     ` Oliver Schneider
2014-06-13  1:23       ` Rich Felker

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140611130937.GR179@brightrain.aerifal.cx \
    --to=dalias@libc.org \
    --cc=musl@lists.openwall.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).