From 3ec755f9b2db95fa05cd38ca32a0dddb255014f8 Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhrozek@redhat.com>
Date: Wed, 7 Jan 2015 10:42:09 +0100
Subject: [PATCH 155/160] GPO: Don't use stdout for output in gpo_child
Resolves:
https://fedorahosted.org/sssd/ticket/2544
Use a dedicated fd instead to work around
https://bugzilla.samba.org/show_bug.cgi?id=11036
Reviewed-by: Sumit Bose <sbose@redhat.com>
(cherry picked from commit f00a61b6079d8de81432077a59daf015d85800d2)
---
src/providers/ad/ad_gpo.c | 7 ++++---
src/providers/ad/ad_gpo.h | 4 ++++
src/providers/ad/ad_gpo_child.c | 7 ++++---
3 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/src/providers/ad/ad_gpo.c b/src/providers/ad/ad_gpo.c
index 1ae62e7c4727702d5338258046e89e4b654904eb..083fc8c2cde36bb15d1a1becd3ddac383a4008fe 100644
--- a/src/providers/ad/ad_gpo.c
+++ b/src/providers/ad/ad_gpo.c
@@ -3961,9 +3961,10 @@ gpo_fork_child(struct tevent_req *req)
pid = fork();
if (pid == 0) { /* child */
- err = exec_child(state,
- pipefd_to_child, pipefd_from_child,
- GPO_CHILD, gpo_child_debug_fd);
+ err = exec_child_ex(state,
+ pipefd_to_child, pipefd_from_child,
+ GPO_CHILD, gpo_child_debug_fd, NULL,
+ STDIN_FILENO, AD_GPO_CHILD_OUT_FILENO);
DEBUG(SSSDBG_CRIT_FAILURE, "Could not exec gpo_child: [%d][%s].\n",
err, strerror(err));
return err;
diff --git a/src/providers/ad/ad_gpo.h b/src/providers/ad/ad_gpo.h
index 77051aadaed7858cce808b5c6c51f0be515d9800..9fd590a2b262b66c1efd493d8736774bdfa61b40 100644
--- a/src/providers/ad/ad_gpo.h
+++ b/src/providers/ad/ad_gpo.h
@@ -23,6 +23,10 @@
#ifndef AD_GPO_H_
#define AD_GPO_H_
+#include "providers/ad/ad_access.h"
+
+#define AD_GPO_CHILD_OUT_FILENO 3
+
/*
* This pair of functions provides client-side GPO processing.
*
diff --git a/src/providers/ad/ad_gpo_child.c b/src/providers/ad/ad_gpo_child.c
index c6eb52f06b1daadb083bd4c9efb299a12031d4d5..27f0db3ec2504e55886094a35cda1f536a7494ee 100644
--- a/src/providers/ad/ad_gpo_child.c
+++ b/src/providers/ad/ad_gpo_child.c
@@ -33,6 +33,7 @@
#include "util/util.h"
#include "util/child_common.h"
#include "providers/dp_backend.h"
+#include "providers/ad/ad_gpo.h"
#include "sss_cli.h"
#define SMB_BUFFER_SIZE 65536
@@ -778,7 +779,7 @@ main(int argc, const char *argv[])
errno = 0;
- written = sss_atomic_write_s(STDOUT_FILENO, resp->buf, resp->size);
+ written = sss_atomic_write_s(AD_GPO_CHILD_OUT_FILENO, resp->buf, resp->size);
if (written == -1) {
ret = errno;
DEBUG(SSSDBG_CRIT_FAILURE, "write failed [%d][%s].\n", ret,
@@ -793,13 +794,13 @@ main(int argc, const char *argv[])
}
DEBUG(SSSDBG_TRACE_FUNC, "gpo_child completed successfully\n");
- close(STDOUT_FILENO);
+ close(AD_GPO_CHILD_OUT_FILENO);
talloc_free(main_ctx);
return EXIT_SUCCESS;
fail:
DEBUG(SSSDBG_CRIT_FAILURE, "gpo_child failed!\n");
- close(STDOUT_FILENO);
+ close(AD_GPO_CHILD_OUT_FILENO);
talloc_free(main_ctx);
return EXIT_FAILURE;
}
--
2.1.0