1. 13 9月, 2018 2 次提交
    • R
      reduce spurious inclusion of libc.h · 5ce37379
      Rich Felker 提交于
      libc.h was intended to be a header for access to global libc state and
      related interfaces, but ended up included all over the place because
      it was the way to get the weak_alias macro. most of the inclusions
      removed here are places where weak_alias was needed. a few were
      recently introduced for hidden. some go all the way back to when
      libc.h defined CANCELPT_BEGIN and _END, and all (wrongly implemented)
      cancellation points had to include it.
      
      remaining spurious users are mostly callers of the LOCK/UNLOCK macros
      and files that use the LFS64 macro to define the awful *64 aliases.
      
      in a few places, new inclusion of libc.h is added because several
      internal headers no longer implicitly include libc.h.
      
      declarations for __lockfile and __unlockfile are moved from libc.h to
      stdio_impl.h so that the latter does not need libc.h. putting them in
      libc.h made no sense at all, since the macros in stdio_impl.h are
      needed to use them correctly anyway.
      5ce37379
    • R
      overhaul internally-public declarations using wrapper headers · 13d1afa4
      Rich Felker 提交于
      commits leading up to this one have moved the vast majority of
      libc-internal interface declarations to appropriate internal headers,
      allowing them to be type-checked and setting the stage to limit their
      visibility. the ones that have not yet been moved are mostly
      namespace-protected aliases for standard/public interfaces, which
      exist to facilitate implementing plain C functions in terms of POSIX
      functionality, or C or POSIX functionality in terms of extensions that
      are not standardized. some don't quite fit this description, but are
      "internally public" interfacs between subsystems of libc.
      
      rather than create a number of newly-named headers to declare these
      functions, and having to add explicit include directives for them to
      every source file where they're needed, I have introduced a method of
      wrapping the corresponding public headers.
      
      parallel to the public headers in $(srcdir)/include, we now have
      wrappers in $(srcdir)/src/include that come earlier in the include
      path order. they include the public header they're wrapping, then add
      declarations for namespace-protected versions of the same interfaces
      and any "internally public" interfaces for the subsystem they
      correspond to.
      
      along these lines, the wrapper for features.h is now responsible for
      the definition of the hidden, weak, and weak_alias macros. this means
      source files will no longer need to include any special headers to
      access these features.
      
      over time, it is my expectation that the scope of what is "internally
      public" will expand, reducing the number of source files which need to
      include *_impl.h and related headers down to those which are actually
      implementing the corresponding subsystems, not just using them.
      13d1afa4
  2. 05 9月, 2017 1 次提交
    • A
      overhaul environment functions · 8e932792
      Alexander Monakov 提交于
      Rewrite environment access functions to slim down code, fix bugs and
      avoid invoking undefined behavior.
      
      * avoid using int-typed iterators where size_t would be correct;
      * use strncmp instead of memcmp consistently;
      * tighten prologues by invoking __strchrnul;
      * handle NULL environ.
      
      putenv:
      * handle "=value" input via unsetenv too (will return -1/EINVAL);
      * rewrite and simplify __putenv; fix the leak caused by failure to
        deallocate entry added by preceding setenv when called from putenv.
      
      setenv:
      * move management of libc-allocated entries to this translation unit,
        and use no-op weak symbols in putenv/unsetenv;
      
      unsetenv:
      * rewrite; this fixes UB caused by testing a free'd pointer against
        NULL on entry to subsequent loops.
      
      Not changed:
      Failure to extend allocation tracking array (previously __env_map, now
      env_alloced) is ignored rather than causing to report -1/ENOMEM to the
      caller; the worst-case consequence is leaking this allocation when it
      is removed or replaced in a subsequent environment access.
      
      Initially UB in unsetenv was reported by Alexander Cherepanov.
      Using a weak alias to avoid pulling in malloc via unsetenv was
      suggested by Rich Felker.
      8e932792
  3. 07 3月, 2016 1 次提交
  4. 12 12月, 2013 1 次提交
  5. 22 10月, 2012 1 次提交
  6. 12 2月, 2011 1 次提交