|
|
784d46 |
From b6f73810a2e7afd02a231e2dfa14b05752c83db7 Mon Sep 17 00:00:00 2001
|
|
|
784d46 |
From: "Dmitry V. Levin" <ldv@altlinux.org>
|
|
|
784d46 |
Date: Wed, 26 Feb 2020 19:20:58 +0000
|
|
|
784d46 |
Subject: [PATCH] pam_modutil_sanitize_helper_fds: fix SIGPIPE effect of
|
|
|
784d46 |
PAM_MODUTIL_PIPE_FD
|
|
|
784d46 |
|
|
|
784d46 |
When pam_modutil_sanitize_helper_fds() is invoked with
|
|
|
784d46 |
PAM_MODUTIL_PIPE_FD to provide a dummy pipe descriptor for stdout
|
|
|
784d46 |
or stderr, it closes the read end of the newly created dummy pipe.
|
|
|
784d46 |
The negative side effect of this approach is that any write to such
|
|
|
784d46 |
descriptor triggers a SIGPIPE. Avoid this by closing the write end of
|
|
|
784d46 |
the dummy pipe and using its read end as a dummy pipe descriptor for
|
|
|
784d46 |
output. Any read from such descriptor returns 0, and any write just
|
|
|
784d46 |
fails with EBADF, which should work better with unprepared writers.
|
|
|
784d46 |
|
|
|
784d46 |
* libpam/pam_modutil_sanitize.c (redirect_out_pipe): Remove.
|
|
|
784d46 |
(redirect_out): Call redirect_in_pipe instead of redirect_out_pipe.
|
|
|
784d46 |
|
|
|
784d46 |
Fixes: b0ec5d1e ("Introduce pam_modutil_sanitize_helper_fds")
|
|
|
784d46 |
---
|
|
|
784d46 |
libpam/pam_modutil_sanitize.c | 30 +-----------------------------
|
|
|
784d46 |
1 file changed, 1 insertion(+), 29 deletions(-)
|
|
|
784d46 |
|
|
|
784d46 |
diff --git a/libpam/pam_modutil_sanitize.c b/libpam/pam_modutil_sanitize.c
|
|
|
784d46 |
index 605c859d..58b9537c 100644
|
|
|
784d46 |
--- a/libpam/pam_modutil_sanitize.c
|
|
|
784d46 |
+++ b/libpam/pam_modutil_sanitize.c
|
|
|
784d46 |
@@ -46,34 +46,6 @@ redirect_in_pipe(pam_handle_t *pamh, int fd, const char *name)
|
|
|
784d46 |
return fd;
|
|
|
784d46 |
}
|
|
|
784d46 |
|
|
|
784d46 |
-/*
|
|
|
784d46 |
- * Creates a pipe, closes its read end, redirects fd to its write end.
|
|
|
784d46 |
- * Returns fd on success, -1 otherwise.
|
|
|
784d46 |
- */
|
|
|
784d46 |
-static int
|
|
|
784d46 |
-redirect_out_pipe(pam_handle_t *pamh, int fd, const char *name)
|
|
|
784d46 |
-{
|
|
|
784d46 |
- int out[2];
|
|
|
784d46 |
-
|
|
|
784d46 |
- if (pipe(out) < 0) {
|
|
|
784d46 |
- pam_syslog(pamh, LOG_ERR, "Could not create pipe: %m");
|
|
|
784d46 |
- return -1;
|
|
|
784d46 |
- }
|
|
|
784d46 |
-
|
|
|
784d46 |
- close(out[0]);
|
|
|
784d46 |
-
|
|
|
784d46 |
- if (out[1] == fd)
|
|
|
784d46 |
- return fd;
|
|
|
784d46 |
-
|
|
|
784d46 |
- if (dup2(out[1], fd) != fd) {
|
|
|
784d46 |
- pam_syslog(pamh, LOG_ERR, "dup2 of %s failed: %m", name);
|
|
|
784d46 |
- fd = -1;
|
|
|
784d46 |
- }
|
|
|
784d46 |
-
|
|
|
784d46 |
- close(out[1]);
|
|
|
784d46 |
- return fd;
|
|
|
784d46 |
-}
|
|
|
784d46 |
-
|
|
|
784d46 |
/*
|
|
|
784d46 |
* Opens /dev/null for writing, redirects fd there.
|
|
|
784d46 |
* Returns fd on success, -1 otherwise.
|
|
|
784d46 |
@@ -106,7 +78,7 @@ redirect_out(pam_handle_t *pamh, enum pam_modutil_redirect_fd mode,
|
|
|
784d46 |
{
|
|
|
784d46 |
switch (mode) {
|
|
|
784d46 |
case PAM_MODUTIL_PIPE_FD:
|
|
|
784d46 |
- if (redirect_out_pipe(pamh, fd, name) < 0)
|
|
|
784d46 |
+ if (redirect_in_pipe(pamh, fd, name) < 0)
|
|
|
784d46 |
return -1;
|
|
|
784d46 |
break;
|
|
|
784d46 |
case PAM_MODUTIL_NULL_FD:
|
|
|
784d46 |
--
|
|
|
784d46 |
2.25.3
|
|
|
784d46 |
|