Re: [exim-dev] [exim-announce] Security release for CVE-2016…

Top Page
Delete this message
Reply to this message
Author: Andrew C Aitchison
Date:  
To: The Doctor
CC: exim-dev
Subject: Re: [exim-dev] [exim-announce] Security release for CVE-2016-1531: 4.84.2, 4.85.2, 4.86.2, 4.87 RC5]
On Wed, 2 Mar 2016, The Doctor wrote:

> Got a problem compiling this
>
> This line
>
> if (unsetenv(CS *name) < 0) return FALSE;
>
> is prevent the compilation.
>
> gcc environment.c
> environment.c: In function `cleanup_environment':
> environment.c:54: warning: cast to pointer from integer of different size
> environment.c:54: void value not ignored as it ought to be
>
> and
>
> man unsetenv
> GETENV(3)                   BSD Programmer's Manual                  GETENV(3)

>
> NAME
>     getenv, putenv, setenv, unsetenv - environment variable functions

>
> SYNOPSIS
>     #include <stdlib.h>

>
>     char *
>     getenv(const char *name);

>
>     int
>     setenv(const char *name, const char *value, int overwrite);

>
>     int
>     putenv(const char *string);

>
>     void
>     unsetenv(const char *name);

>
> DESCRIPTION
>     These functions set, unset and fetch environment variables from the host
>     environment list. For compatibility with differing environment conven-
>     tions, the given arguments name and value may be appended and prepended,
>     respectively, with an equal sign ``=''.

>
>     The getenv() function obtains the current value of the environment vari-
>     able, name. If the variable name is not in the current environment, a
>     null pointer is returned.

>
>     The setenv() function inserts or resets the environment variable name in
>     the current environment list.  If the variable name does not exist in the
>     list, it is inserted with the given value. If the variable does exist,
>     the argument overwrite is tested; if overwrite is zero, the variable is
>     not reset, otherwise it is reset to the given value.

>
>     The putenv() function takes an argument of the form ``name=value'' and is
>     equivalent to:

>
>           setenv(name, value, 1);

>
>     The unsetenv() function deletes all instances of the variable name point-
>     ed to by name from the list.

>
> RETURN VALUES
>     The functions setenv() and putenv() return zero if successful; otherwise
>     the global variable errno is set to indicate the error and a -1 is re-
>     turned.

>
> ERRORS
>     [ENOMEM]  The function setenv() or putenv() failed because they were un-
>               able to allocate memory for the environment.

>
> SEE ALSO
>     csh(1),  sh(1),  execve(2),  environ(7)

>
> STANDARDS
>     The getenv() function conforms to ANSI C X3.159-1989 (``ANSI C '').


Hmm. Looks like BSD and Linux differ:

SYNOPSIS
        #include <stdlib.h>


        int setenv(const char *name, const char *value, int overwrite);


        int unsetenv(const char *name);


    Feature    Test    Macro    Requirements   for   glibc   (see   fea-
    ture_test_macros(7)):


        setenv(), unsetenv(): _BSD_SOURCE || _POSIX_C_SOURCE >= 200112L
        || _XOPEN_SOURCE >= 600



     ...        ...        ..


RETURN VALUE
        The  setenv()  function  returns zero on success, or -1 if there
        was insufficient space in the environment.


        The unsetenv() function returns zero on success, or -1 on error,
        with errno set to indicate the cause of the error.


ERRORS
        EINVAL name contained an '=' character.


CONFORMING TO
        4.3BSD, POSIX.1-2001.


NOTES
        POSIX.1-2001 does not require setenv() or unsetenv() to be reentrant.
        Prior to glibc 2.2.2, unsetenv() was prototyped as returning void;
        more recent glibc versions follow the POSIX.1-2001-compliant
        prototype shown in the SYNOPSIS.