/* * Constructor and destructor for PAM data. * * The PAM utility functions often need an initial argument that encapsulates * the PAM handle, some configuration information, and possibly a Kerberos * context. This implements a constructor and destructor for that data * structure. * * The individual PAM modules should provide a definition of the pam_config * struct appropriate to that module. None of the PAM utility functions need * to know what that configuration struct looks like, and it must be freed * before calling putil_args_free(). * * The canonical version of this file is maintained in the rra-c-util package, * which can be found at . * * Written by Russ Allbery * Copyright 2010, 2012-2014 * The Board of Trustees of the Leland Stanford Junior University * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * * SPDX-License-Identifier: MIT */ #include #ifdef HAVE_KRB5 # include #endif #include #include #include #include #include /* * Allocate a new pam_args struct and return it, or NULL on memory allocation * or Kerberos initialization failure. If HAVE_KRB5 is defined, we also * allocate a Kerberos context. */ struct pam_args * putil_args_new(pam_handle_t *pamh, int flags) { struct pam_args *args; #ifdef HAVE_KRB5 krb5_error_code status; #endif args = calloc(1, sizeof(struct pam_args)); if (args == NULL) { putil_crit(NULL, "cannot allocate memory: %s", strerror(errno)); return NULL; } args->pamh = pamh; args->silent = ((flags & PAM_SILENT) == PAM_SILENT); #ifdef HAVE_KRB5 if (issetugid()) status = krb5_init_secure_context(&args->ctx); else status = krb5_init_context(&args->ctx); if (status != 0) { putil_err_krb5(args, status, "cannot create Kerberos context"); free(args); return NULL; } #endif /* HAVE_KRB5 */ return args; } /* * Free a pam_args struct. The config member must be freed separately. */ void putil_args_free(struct pam_args *args) { if (args == NULL) return; #ifdef HAVE_KRB5 free(args->realm); if (args->ctx != NULL) krb5_free_context(args->ctx); #endif free(args); }