summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry V. Levin <ldv@altlinux.org>2020-12-23 08:00:00 +0000
committerDmitry V. Levin <ldv@altlinux.org>2020-12-28 19:38:26 +0000
commit8eaec98ec7b68da3e688e57b701531656dd14492 (patch)
tree3339aebe5ace71f82ad3696f60a5fbcc98888cab
parent0d5bc05835e56f823d5d0fdd7efc211a6f2980f7 (diff)
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.
-rw-r--r--modules/pam_umask/pam_umask.c18
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);