source: openpam/trunk/lib/libpam/pam_putenv.c @ 913

Last change on this file since 913 was 913, checked in by Dag-Erling Smørgrav, 4 years ago

Newer versions of clang take nonnull annotations into account not only
when compiling code that calls the function, but also when compiling the
function itself. This means that NULL checks in the function trigger
condition-always-false warnings. We have a choice between disabling these
warnings, removing the nonnull annotations, or removing the NULL checks.
We prefer to keep the annotations and warnings and remove the checks. In
all cases, passing NULL to the function in question will result in a
segmentation fault, which is often easier to debug than an error return,
especially when most of these checks were for the PAM handle, which can only
be NULL if the caller ignored an error return from pam_start().

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 3.3 KB
Line 
1/*-
2 * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
3 * Copyright (c) 2004-2011 Dag-Erling Smørgrav
4 * All rights reserved.
5 *
6 * This software was developed for the FreeBSD Project by ThinkSec AS and
7 * Network Associates Laboratories, the Security Research Division of
8 * Network Associates, Inc.  under DARPA/SPAWAR contract N66001-01-C-8035
9 * ("CBOSS"), as part of the DARPA CHATS research program.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 *    notice, this list of conditions and the following disclaimer in the
18 *    documentation and/or other materials provided with the distribution.
19 * 3. The name of the author may not be used to endorse or promote
20 *    products derived from this software without specific prior written
21 *    permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 *
35 * $Id: pam_putenv.c 913 2017-01-21 15:11:12Z des $
36 */
37
38#ifdef HAVE_CONFIG_H
39# include "config.h"
40#endif
41
42#include <stdlib.h>
43#include <string.h>
44
45#include <security/pam_appl.h>
46
47#include "openpam_impl.h"
48
49/*
50 * XSSO 4.2.1
51 * XSSO 6 page 56
52 *
53 * Set the value of an environment variable
54 */
55
56int
57pam_putenv(pam_handle_t *pamh,
58        const char *namevalue)
59{
60        char **env, *p;
61        size_t env_size;
62        int i;
63
64        ENTER();
65
66        /* sanity checks */
67        if ((p = strchr(namevalue, '=')) == NULL)
68                RETURNC(PAM_SYSTEM_ERR);
69
70        /* see if the variable is already in the environment */
71        if ((i = openpam_findenv(pamh, namevalue, p - namevalue)) >= 0) {
72                if ((p = strdup(namevalue)) == NULL)
73                        RETURNC(PAM_BUF_ERR);
74                FREE(pamh->env[i]);
75                pamh->env[i] = p;
76                RETURNC(PAM_SUCCESS);
77        }
78
79        /* grow the environment list if necessary */
80        if (pamh->env_count == pamh->env_size) {
81                env_size = pamh->env_size * 2 + 1;
82                env = realloc(pamh->env, sizeof(char *) * env_size);
83                if (env == NULL)
84                        RETURNC(PAM_BUF_ERR);
85                pamh->env = env;
86                pamh->env_size = env_size;
87        }
88
89        /* add the variable at the end */
90        if ((pamh->env[pamh->env_count] = strdup(namevalue)) == NULL)
91                RETURNC(PAM_BUF_ERR);
92        ++pamh->env_count;
93        RETURNC(PAM_SUCCESS);
94}
95
96/*
97 * Error codes:
98 *
99 *      PAM_SYSTEM_ERR
100 *      PAM_BUF_ERR
101 */
102
103/**
104 * The =pam_putenv function sets an environment variable.
105 * Its semantics are similar to those of =putenv, but it modifies the PAM
106 * context's environment list instead of the application's.
107 *
108 * >pam_getenv
109 * >pam_getenvlist
110 * >pam_setenv
111 */
Note: See TracBrowser for help on using the repository browser.