source: openpam/trunk/lib/libpam/pam_set_item.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.5 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_set_item.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 <sys/param.h>
43
44#include <stdlib.h>
45#include <string.h>
46
47#include <security/pam_appl.h>
48
49#include "openpam_impl.h"
50
51/*
52 * XSSO 4.2.1
53 * XSSO 6 page 60
54 *
55 * Set authentication information
56 */
57
58int
59pam_set_item(pam_handle_t *pamh,
60        int item_type,
61        const void *item)
62{
63        void **slot, *tmp;
64        size_t nsize, osize;
65
66        ENTERI(item_type);
67        slot = &pamh->item[item_type];
68        osize = nsize = 0;
69        switch (item_type) {
70        case PAM_SERVICE:
71                /* set once only, by pam_start() */
72                if (*slot != NULL)
73                        RETURNC(PAM_SYSTEM_ERR);
74                /* fall through */
75        case PAM_USER:
76        case PAM_AUTHTOK:
77        case PAM_OLDAUTHTOK:
78        case PAM_TTY:
79        case PAM_RHOST:
80        case PAM_RUSER:
81        case PAM_USER_PROMPT:
82        case PAM_AUTHTOK_PROMPT:
83        case PAM_OLDAUTHTOK_PROMPT:
84        case PAM_HOST:
85                if (*slot != NULL)
86                        osize = strlen(*slot) + 1;
87                if (item != NULL)
88                        nsize = strlen(item) + 1;
89                break;
90        case PAM_REPOSITORY:
91                osize = nsize = sizeof(struct pam_repository);
92                break;
93        case PAM_CONV:
94                osize = nsize = sizeof(struct pam_conv);
95                break;
96        default:
97                RETURNC(PAM_SYMBOL_ERR);
98        }
99        if (*slot != NULL) {
100                memset(*slot, 0xd0, osize);
101                FREE(*slot);
102        }
103        if (item != NULL) {
104                if ((tmp = malloc(nsize)) == NULL)
105                        RETURNC(PAM_BUF_ERR);
106                memcpy(tmp, item, nsize);
107        } else {
108                tmp = NULL;
109        }
110        *slot = tmp;
111        RETURNC(PAM_SUCCESS);
112}
113
114/*
115 * Error codes:
116 *
117 *      PAM_SYMBOL_ERR
118 *      PAM_SYSTEM_ERR
119 *      PAM_BUF_ERR
120 */
121
122/**
123 * The =pam_set_item function sets the item specified by the =item_type
124 * argument to a copy of the object pointed to by the =item argument.
125 * The item is stored in the PAM context specified by the =pamh argument.
126 * See =pam_get_item for a list of recognized item types.
127 */
Note: See TracBrowser for help on using the repository browser.