diff options
author | Dmitry V. Levin <ldv@altlinux.org> | 2020-12-23 08:00:00 +0000 |
---|---|---|
committer | Dmitry V. Levin <ldv@altlinux.org> | 2020-12-28 19:38:26 +0000 |
commit | 8eaec98ec7b68da3e688e57b701531656dd14492 (patch) | |
tree | 3339aebe5ace71f82ad3696f60a5fbcc98888cab /modules/pam_umask | |
parent | 0d5bc05835e56f823d5d0fdd7efc211a6f2980f7 (diff) | |
download | pam-8eaec98ec7b68da3e688e57b701531656dd14492.tar.gz pam-8eaec98ec7b68da3e688e57b701531656dd14492.tar.bz2 pam-8eaec98ec7b68da3e688e57b701531656dd14492.zip |
pam_umask: fix handling of umask parameter
Potential failures of strdup(3) were ignored, fix this by not using
strdup(3) at all.
* modules/pam_umask/pam_umask.c (struct options_t): Add const to umask
field, add login_umask field.
(parse_option): Do not use strdup.
(get_options): Assign pam_modutil_search_key return values
to options->login_umask.
(pam_sm_open_session): Free options.login_umask instead of
options.umask.
Diffstat (limited to 'modules/pam_umask')
-rw-r--r-- | modules/pam_umask/pam_umask.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/modules/pam_umask/pam_umask.c b/modules/pam_umask/pam_umask.c index c9efe245..72b10e92 100644 --- a/modules/pam_umask/pam_umask.c +++ b/modules/pam_umask/pam_umask.c @@ -64,7 +64,8 @@ struct options_t { int debug; int usergroups; int silent; - char *umask; + const char *umask; + char *login_umask; }; typedef struct options_t options_t; @@ -79,7 +80,7 @@ parse_option (const pam_handle_t *pamh, const char *argv, options_t *options) if (strcasecmp (argv, "debug") == 0) options->debug = 1; else if ((str = pam_str_skip_icase_prefix (argv, "umask=")) != NULL) - options->umask = strdup (str); + options->umask = str; else if (strcasecmp (argv, "usergroups") == 0) options->usergroups = 1; else if (strcasecmp (argv, "nousergroups") == 0) @@ -102,10 +103,12 @@ get_options (pam_handle_t *pamh, options_t *options, for ( ; argc-- > 0; argv++) parse_option (pamh, *argv, options); - if (options->umask == NULL) - options->umask = pam_modutil_search_key (pamh, LOGIN_DEFS, "UMASK"); - if (options->umask == NULL) - options->umask = pam_modutil_search_key (pamh, LOGIN_CONF, "UMASK"); + if (options->umask == NULL) { + options->login_umask = pam_modutil_search_key (pamh, LOGIN_DEFS, "UMASK"); + if (options->login_umask == NULL) + options->login_umask = pam_modutil_search_key (pamh, LOGIN_CONF, "UMASK"); + options->umask = options->login_umask; + } return 0; } @@ -216,7 +219,8 @@ pam_sm_open_session (pam_handle_t *pamh, int flags UNUSED, if (options.umask != NULL) { set_umask (options.umask); - free (options.umask); + free (options.login_umask); + options.umask = options.login_umask = NULL; } setup_limits_from_gecos (pamh, &options, pw); |