diff options
Diffstat (limited to 'pam_umotd/pam_umotd.c')
-rw-r--r-- | pam_umotd/pam_umotd.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/pam_umotd/pam_umotd.c b/pam_umotd/pam_umotd.c index 2fea67c..008e87b 100644 --- a/pam_umotd/pam_umotd.c +++ b/pam_umotd/pam_umotd.c | |||
@@ -340,13 +340,19 @@ pam_sm_open_session(pam_handle_t *pamh, int flags, int argc, const char **argv) | |||
340 | char *file; | 340 | char *file; |
341 | 341 | ||
342 | slist = gray_slist_create(); | 342 | slist = gray_slist_create(); |
343 | if (!slist) | ||
344 | retval = errno_to_pam(errno); | ||
345 | else { | ||
343 | gray_expand_string(pamh, motd_file_name, slist); | 346 | gray_expand_string(pamh, motd_file_name, slist); |
344 | gray_slist_append_char(slist, 0); | 347 | gray_slist_append_char(slist, 0); |
345 | file = gray_slist_finish(slist); | 348 | file = gray_slist_finish(slist); |
349 | if (file) | ||
346 | retval = read_file(pamh, file); | 350 | retval = read_file(pamh, file); |
351 | else | ||
352 | retval = errno_to_pam(errno); | ||
353 | } | ||
347 | gray_slist_free(&slist); | 354 | gray_slist_free(&slist); |
348 | } else if (optindex >= 0) { | 355 | } else if (optindex >= 0) { |
349 | int i; | ||
350 | char **xargv; | 356 | char **xargv; |
351 | 357 | ||
352 | argc -= optindex; | 358 | argc -= optindex; |
@@ -355,17 +361,30 @@ pam_sm_open_session(pam_handle_t *pamh, int flags, int argc, const char **argv) | |||
355 | _pam_log(LOG_INFO, "empty command line"); | 361 | _pam_log(LOG_INFO, "empty command line"); |
356 | return retval; | 362 | return retval; |
357 | } | 363 | } |
358 | xargv = gray_malloc((argc + 1) * sizeof (xargv[0])); | 364 | xargv = calloc((argc + 1), sizeof (xargv[0])); |
365 | if (!xargv) | ||
366 | return errno_to_pam(errno); | ||
359 | slist = gray_slist_create(); | 367 | slist = gray_slist_create(); |
368 | if (!slist) | ||
369 | retval = errno_to_pam(errno); | ||
370 | else { | ||
371 | int i; | ||
372 | int ec; | ||
373 | |||
360 | for (i = 0; i < argc; i++) { | 374 | for (i = 0; i < argc; i++) { |
361 | gray_expand_string(pamh, argv[i], slist); | 375 | gray_expand_string(pamh, argv[i], slist); |
362 | gray_slist_append_char(slist, 0); | 376 | gray_slist_append_char(slist, 0); |
363 | xargv[i] = gray_slist_finish(slist); | 377 | xargv[i] = gray_slist_finish(slist); |
364 | } | 378 | } |
365 | xargv[i] = NULL; | 379 | xargv[i] = NULL; |
380 | ec = gray_slist_err(slist); | ||
381 | if (ec) | ||
382 | retval = errno_to_pam(ec); | ||
383 | else | ||
366 | retval = exec_file(pamh, xargv, logfile_name); | 384 | retval = exec_file(pamh, xargv, logfile_name); |
367 | free(xargv); | 385 | free(xargv); |
368 | gray_slist_free(&slist); | 386 | gray_slist_free(&slist); |
387 | } | ||
369 | } else | 388 | } else |
370 | _pam_log(LOG_ERR, | 389 | _pam_log(LOG_ERR, |
371 | "invalid usage: either file or exec must be specified"); | 390 | "invalid usage: either file or exec must be specified"); |