The branch, master has been updated
       via  c9508b971ca auth3: talloc_strackframe() panics on failure
       via  117f00158af auth: Fix a typo
       via  a01f680e43a passdb: Add error checks in samu_set_unix_internal()
       via  4e034e8f8fc auth3: if (ret==False) just looks weird
       via  ee431a29872 auth3: Fix a typo
       via  b150982d90b auth3: Use auth3_context_set_challenge() in 
auth3_set_challenge()
       via  cdd9d423716 auth3: Apply some const to auth3_context_set_challenge()
       via  ad7628b2cb2 gensec: Slightly simplify 
gensec_generate_session_info_pac()
       via  349bd015d22 lib: Remove close_low_fds()
       via  00b57391dd2 lib: Directly call close_low_fd() in become_daemon()
       via  8728bf91471 smbd: Replace call to close_low_fds() with direct calls
       via  8d2eb62a107 printing: Avoid zombies in the background daemon
       via  ce97c671862 printing: Reduce indentation in start_background_queue()
       via  7997a090c68 printing: Remove dead code
       via  3ba5ed73fcf printing: Remove the pause_pipe[] from queue_process.c
      from  2e2426e5157 samba-tool group listmembers: always list objects which 
can not expire

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit c9508b971ca54d5293d8976190635c406bd209c6
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Apr 22 10:29:24 2021 +0200

    auth3: talloc_strackframe() panics on failure
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>
    
    Autobuild-User(master): Andreas Schneider <a...@cryptomilk.org>
    Autobuild-Date(master): Tue Apr 27 14:14:22 UTC 2021 on sn-devel-184

commit 117f00158afe74e8e1abf1a0a637cebc2738c36d
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Apr 22 10:29:14 2021 +0200

    auth: Fix a typo
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit a01f680e43a4aade9fde9bf83842647a3f9f708c
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Apr 21 21:51:44 2021 +0200

    passdb: Add error checks in samu_set_unix_internal()
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 4e034e8f8fcd5e63dc4afe5a210ccea347bfa523
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Apr 21 21:30:30 2021 +0200

    auth3: if (ret==False) just looks weird
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit ee431a298726b61fd0244c42e613fde87e2bdd82
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Apr 21 12:56:04 2021 +0200

    auth3: Fix a typo
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit b150982d90bf2c1d4dcf08384b1d35614d162e65
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Apr 21 12:29:16 2021 +0200

    auth3: Use auth3_context_set_challenge() in auth3_set_challenge()
    
    Don't duplicate what's already there.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit cdd9d423716f4f917a9f4589ac90ee1b21d11c02
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Apr 21 12:28:12 2021 +0200

    auth3: Apply some const to auth3_context_set_challenge()
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit ad7628b2cb254d9b25ee70f86edfeb725e809b01
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Apr 21 11:30:20 2021 +0200

    gensec: Slightly simplify gensec_generate_session_info_pac()
    
    Reduce indentation by an early error return and by introducing a
    helper variable.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 349bd015d227a625990af7122e39319431f7af8d
Author: Volker Lendecke <v...@samba.org>
Date:   Fri Apr 23 16:37:31 2021 +0200

    lib: Remove close_low_fds()
    
    There were only two callers, it did not do proper error handling, and
    it was confusing to call.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 00b57391dd27d15fa25d5577b7c0192802468bab
Author: Volker Lendecke <v...@samba.org>
Date:   Fri Apr 23 16:35:02 2021 +0200

    lib: Directly call close_low_fd() in become_daemon()
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 8728bf91471fe044c989b2c8eaf9f5945f347b9b
Author: Volker Lendecke <v...@samba.org>
Date:   Fri Apr 23 16:31:08 2021 +0200

    smbd: Replace call to close_low_fds() with direct calls
    
    Check the errors from close_low_fd(). Also, close_low_fds() does not
    really add a lot of value, for example there's no caller that closes
    stderr.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 8d2eb62a1070dc2ee5be99338d4fa66981002c12
Author: Volker Lendecke <v...@samba.org>
Date:   Fri Apr 23 11:17:33 2021 +0200

    printing: Avoid zombies in the background daemon
    
    Whatever you read about waitpid() tells you should should run it in a
    loop.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit ce97c67186266213ef78ccc56917a6bb45bd200d
Author: Volker Lendecke <v...@samba.org>
Date:   Fri Apr 23 16:09:43 2021 +0200

    printing: Reduce indentation in start_background_queue()
    
    We don't need the "if(pid==0)" here, we've covered "if(pid!=0)" a few
    lines above.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 7997a090c687df56c29607d4860b306aeb1dd237
Author: Volker Lendecke <v...@samba.org>
Date:   Fri Apr 23 16:07:38 2021 +0200

    printing: Remove dead code
    
    This was already covered a few lines above.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

commit 3ba5ed73fcf40b4e18ae84c272188849449586fe
Author: Volker Lendecke <v...@samba.org>
Date:   Fri Apr 23 16:03:57 2021 +0200

    printing: Remove the pause_pipe[] from queue_process.c
    
    Since c80f70390c37 we don't need this explicit pipe anymore.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andreas Schneider <a...@samba.org>

-----------------------------------------------------------------------

Summary of changes:
 auth/gensec/gensec_util.c        |  30 +++++---
 lib/util/become_daemon.c         |  40 +++-------
 lib/util/become_daemon.h         |   9 ---
 librpc/idl/auth.idl              |   2 +-
 source3/auth/auth.c              |   6 +-
 source3/auth/auth_ntlmssp.c      |  16 ++--
 source3/auth/check_samsec.c      |   2 +-
 source3/auth/proto.h             |   6 +-
 source3/auth/server_info_sam.c   |   7 +-
 source3/passdb/passdb.c          |  78 ++++++++++++++++----
 source3/printing/queue_process.c | 153 +++++++++++++++------------------------
 source3/smbd/server.c            |  17 ++++-
 12 files changed, 188 insertions(+), 178 deletions(-)


Changeset truncated at 500 lines:

diff --git a/auth/gensec/gensec_util.c b/auth/gensec/gensec_util.c
index e185acc0c20..e411751c3af 100644
--- a/auth/gensec/gensec_util.c
+++ b/auth/gensec/gensec_util.c
@@ -38,6 +38,8 @@ NTSTATUS gensec_generate_session_info_pac(TALLOC_CTX *mem_ctx,
                                          struct auth_session_info 
**session_info)
 {
        uint32_t session_info_flags = 0;
+       struct auth4_context *auth_context = NULL;
+       NTSTATUS status;
 
        if (gensec_security->want_features & GENSEC_FEATURE_UNIX_TOKEN) {
                session_info_flags |= AUTH_SESSION_INFO_UNIX_TOKEN;
@@ -55,19 +57,25 @@ NTSTATUS gensec_generate_session_info_pac(TALLOC_CTX 
*mem_ctx,
                           "user lookup\n", principal_string);
        }
 
-       if (gensec_security->auth_context && 
gensec_security->auth_context->generate_session_info_pac) {
-               return 
gensec_security->auth_context->generate_session_info_pac(gensec_security->auth_context,
-                                                                               
mem_ctx,
-                                                                               
smb_krb5_context,
-                                                                               
pac_blob,
-                                                                               
principal_string,
-                                                                               
remote_address,
-                                                                               
session_info_flags,
-                                                                               
session_info);
-       } else {
-               DEBUG(0, ("Cannot generate a session_info without the 
auth_context\n"));
+       auth_context = gensec_security->auth_context;
+
+       if ((auth_context == NULL) ||
+           (auth_context->generate_session_info_pac == NULL)) {
+               DBG_ERR("Cannot generate a session_info without "
+                       "the auth_context\n");
                return NT_STATUS_INTERNAL_ERROR;
        }
+
+       status = auth_context->generate_session_info_pac(
+               auth_context,
+               mem_ctx,
+               smb_krb5_context,
+               pac_blob,
+               principal_string,
+               remote_address,
+               session_info_flags,
+               session_info);
+       return status;
 }
 
 /*
diff --git a/lib/util/become_daemon.c b/lib/util/become_daemon.c
index 800a57437cc..984d4a82bcc 100644
--- a/lib/util/become_daemon.c
+++ b/lib/util/become_daemon.c
@@ -45,33 +45,6 @@ void daemon_sd_notifications(bool enable)
                  sd_notifications ? "enabled" : "disabled");
 }
 
-/*******************************************************************
- Close the low 3 fd's and open dev/null in their place.
-********************************************************************/
-
-void close_low_fds(bool stdin_too, bool stdout_too, bool stderr_too)
-{
-
-       if (stdin_too) {
-               int ret = close_low_fd(0);
-               if (ret != 0) {
-                       DBG_ERR("close_low_fd(0) failed: %s\n", strerror(ret));
-               }
-       }
-       if (stdout_too) {
-               int ret = close_low_fd(1);
-               if (ret != 0) {
-                       DBG_ERR("close_low_fd(1) failed: %s\n", strerror(ret));
-               }
-       }
-       if (stderr_too) {
-               int ret = close_low_fd(2);
-               if (ret != 0) {
-                       DBG_ERR("close_low_fd(2) failed: %s\n", strerror(ret));
-               }
-       }
-}
-
 /****************************************************************************
  Become a daemon, discarding the controlling terminal.
 ****************************************************************************/
@@ -115,7 +88,18 @@ void become_daemon(bool do_fork, bool no_session, bool 
log_stdout)
        /* stdin must be open if we do not fork, for monitoring for
         * close.  stdout must be open if we are logging there, and we
         * never close stderr (but debug might dup it onto a log file) */
-       close_low_fds(do_fork, !log_stdout, false);
+       if (do_fork) {
+               int ret = close_low_fd(0);
+               if (ret != 0) {
+                       exit_daemon("close_low_fd(0) failed: %s\n", errno);
+               }
+       }
+       if (!log_stdout) {
+               int ret = close_low_fd(1);
+               if (ret != 0) {
+                       exit_daemon("close_low_fd(1) failed: %s\n", errno);
+               }
+       }
 }
 
 void exit_daemon(const char *msg, int error)
diff --git a/lib/util/become_daemon.h b/lib/util/become_daemon.h
index 149d4c0175e..e12be27246b 100644
--- a/lib/util/become_daemon.h
+++ b/lib/util/become_daemon.h
@@ -32,15 +32,6 @@
  * @brief Utilities for demonising
  */
 
-/**
- * @brief Close the low 3 file descriptors and open /dev/null in their place
- *
- * @param[in] stdin_too Should stdin be closed?
- * @param[in] stdout_too Should stdout be closed?
- * @param[in] stderr_too Should stderr be closed?
-**/
-void close_low_fds(bool stdin_too, bool stdout_too, bool stderr_too);
-
 /**
  * @brief Enable or disable daemon status systemd notifications
  *
diff --git a/librpc/idl/auth.idl b/librpc/idl/auth.idl
index 1092935b971..7de3d4c6bfb 100644
--- a/librpc/idl/auth.idl
+++ b/librpc/idl/auth.idl
@@ -25,7 +25,7 @@ interface auth
        } auth_method;
 
        /* This is the parts of the session_info that don't change
-        * during local privilage and group manipulations */
+        * during local privilege and group manipulations */
        typedef [public] struct {
                [unique,charset(UTF8),string] char *account_name;
                [unique,charset(UTF8),string] char *user_principal_name;
diff --git a/source3/auth/auth.c b/source3/auth/auth.c
index e67f4961ddb..ce6bf6c5621 100644
--- a/source3/auth/auth.c
+++ b/source3/auth/auth.c
@@ -609,8 +609,10 @@ NTSTATUS make_auth3_context_for_winbind(TALLOC_CTX 
*mem_ctx,
        return make_auth_context_specific(mem_ctx, auth_context, methods);
 }
 
-bool auth3_context_set_challenge(struct auth_context *ctx, uint8_t chal[8],
-                                const char *challenge_set_by)
+bool auth3_context_set_challenge(
+       struct auth_context *ctx,
+       const uint8_t chal[8],
+       const char *challenge_set_by)
 {
        ctx->challenge = data_blob_talloc(ctx, chal, 8);
        if (ctx->challenge.data == NULL) {
diff --git a/source3/auth/auth_ntlmssp.c b/source3/auth/auth_ntlmssp.c
index 8d213f194cf..676aa9d892c 100644
--- a/source3/auth/auth_ntlmssp.c
+++ b/source3/auth/auth_ntlmssp.c
@@ -43,7 +43,7 @@ NTSTATUS auth3_generate_session_info(struct auth4_context 
*auth_context,
         * Some callers pass auth_user_info_dc, the SCHANNEL and
         * NCALRPC_AS_SYSTEM gensec modules.
         *
-        * While the reset passes auth3_check_password() returned.
+        * While the rest passes auth3_check_password() returned.
         */
        user_info = talloc_get_type(server_returned_info,
                                    struct auth_user_info_dc);
@@ -111,13 +111,15 @@ NTSTATUS auth3_set_challenge(struct auth4_context 
*auth4_context, const uint8_t
 {
        struct auth_context *auth_context = 
talloc_get_type_abort(auth4_context->private_data,
                                                                  struct 
auth_context);
+       bool ok;
 
-       auth_context->challenge = data_blob_talloc(auth_context,
-                                                  chal, 8);
-       NT_STATUS_HAVE_NO_MEMORY(auth_context->challenge.data);
-
-       auth_context->challenge_set_by = talloc_strdup(auth_context, 
challenge_set_by);
-       NT_STATUS_HAVE_NO_MEMORY(auth_context->challenge_set_by);
+       ok = auth3_context_set_challenge(auth_context, chal, challenge_set_by);
+       if (!ok) {
+               /*
+                * This can only fail for ENOMEM
+                */
+               return NT_STATUS_NO_MEMORY;
+       }
 
        DEBUG(5, ("auth_context challenge set by %s\n", 
auth_context->challenge_set_by));
        DEBUG(5, ("challenge is: \n"));
diff --git a/source3/auth/check_samsec.c b/source3/auth/check_samsec.c
index cfd32c5f5ba..b9563c958a9 100644
--- a/source3/auth/check_samsec.c
+++ b/source3/auth/check_samsec.c
@@ -394,7 +394,7 @@ NTSTATUS check_sam_security(const DATA_BLOB *challenge,
        ret = pdb_getsampwnam(sampass, user_info->mapped.account_name);
        unbecome_root();
 
-       if (ret == False) {
+       if (!ret) {
                DEBUG(3,("check_sam_security: Couldn't find user '%s' in "
                         "passdb.\n", user_info->mapped.account_name));
                TALLOC_FREE(sampass);
diff --git a/source3/auth/proto.h b/source3/auth/proto.h
index bb247b9187c..036d4004c38 100644
--- a/source3/auth/proto.h
+++ b/source3/auth/proto.h
@@ -42,8 +42,10 @@ NTSTATUS make_auth3_context_for_netlogon(TALLOC_CTX *mem_ctx,
                                         struct auth_context **auth_context);
 NTSTATUS make_auth3_context_for_winbind(TALLOC_CTX *mem_ctx,
                                        struct auth_context **auth_context);
-bool auth3_context_set_challenge(struct auth_context *ctx, uint8_t chal[8],
-                                const char *challenge_set_by);
+bool auth3_context_set_challenge(
+       struct auth_context *ctx,
+       const uint8_t chal[8],
+       const char *challenge_set_by);
 
 /****************************************************************************
  Try to get a challenge out of the various authentication modules.
diff --git a/source3/auth/server_info_sam.c b/source3/auth/server_info_sam.c
index 755791c1be4..79a7af7281e 100644
--- a/source3/auth/server_info_sam.c
+++ b/source3/auth/server_info_sam.c
@@ -65,14 +65,9 @@ NTSTATUS make_server_info_sam(TALLOC_CTX *mem_ctx,
        struct passwd *pwd;
        struct auth_serversupplied_info *server_info;
        const char *username = pdb_get_username(sampass);
-       TALLOC_CTX *tmp_ctx;
+       TALLOC_CTX *tmp_ctx = talloc_stackframe();
        NTSTATUS status;
 
-       tmp_ctx = talloc_stackframe();
-       if (tmp_ctx == NULL) {
-               return NT_STATUS_NO_MEMORY;
-       }
-
        server_info = make_server_info(tmp_ctx);
        if (server_info == NULL) {
                status = NT_STATUS_NO_MEMORY;
diff --git a/source3/passdb/passdb.c b/source3/passdb/passdb.c
index 4ce643a1833..f4cbbe6c06e 100644
--- a/source3/passdb/passdb.c
+++ b/source3/passdb/passdb.c
@@ -137,6 +137,7 @@ static NTSTATUS samu_set_unix_internal(struct pdb_methods 
*methods,
        const char *domain = lp_netbios_name();
        char *fullname;
        uint32_t urid;
+       bool ok;
 
        if ( !pwd ) {
                return NT_STATUS_NO_SUCH_USER;
@@ -144,7 +145,10 @@ static NTSTATUS samu_set_unix_internal(struct pdb_methods 
*methods,
 
        /* Basic properties based upon the Unix account information */
 
-       pdb_set_username(user, pwd->pw_name, PDB_SET);
+       ok = pdb_set_username(user, pwd->pw_name, PDB_SET);
+       if (!ok) {
+               return NT_STATUS_NO_MEMORY;
+       }
 
        fullname = NULL;
 
@@ -157,16 +161,26 @@ static NTSTATUS samu_set_unix_internal(struct pdb_methods 
*methods,
                fullname = talloc_strndup(
                        talloc_tos(), pwd->pw_gecos,
                        strchr(pwd->pw_gecos, ',') - pwd->pw_gecos);
+               if (fullname == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+               }
        }
 
        if (fullname != NULL) {
-               pdb_set_fullname(user, fullname, PDB_SET);
+               ok = pdb_set_fullname(user, fullname, PDB_SET);
        } else {
-               pdb_set_fullname(user, pwd->pw_gecos, PDB_SET);
+               ok = pdb_set_fullname(user, pwd->pw_gecos, PDB_SET);
        }
        TALLOC_FREE(fullname);
 
-       pdb_set_domain (user, get_global_sam_name(), PDB_DEFAULT);
+       if (!ok) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       ok = pdb_set_domain(user, get_global_sam_name(), PDB_DEFAULT);
+       if (!ok) {
+               return NT_STATUS_NO_MEMORY;
+       }
 #if 0
        /* This can lead to a primary group of S-1-22-2-XX which 
           will be rejected by other parts of the Samba code. 
@@ -180,6 +194,9 @@ static NTSTATUS samu_set_unix_internal(struct pdb_methods 
*methods,
        /* save the password structure for later use */
 
        user->unix_pw = tcopy_passwd( user, pwd );
+       if (user->unix_pw == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
 
        /* Special case for the guest account which must have a RID of 501 */
 
@@ -212,18 +229,53 @@ static NTSTATUS samu_set_unix_internal(struct pdb_methods 
*methods,
 
                /* set some basic attributes */
 
-               pdb_set_profile_path(user, talloc_sub_specified(user, 
-                       lp_logon_path(), pwd->pw_name, NULL, domain, 
pwd->pw_uid, pwd->pw_gid),
-                       PDB_DEFAULT);           
-               pdb_set_homedir(user, talloc_sub_specified(user, 
-                       lp_logon_home(), pwd->pw_name, NULL, domain, 
pwd->pw_uid, pwd->pw_gid),
+               ok = pdb_set_profile_path(
+                       user,
+                       talloc_sub_specified(
+                               user,
+                               lp_logon_path(),
+                               pwd->pw_name,
+                               NULL,
+                               domain,
+                               pwd->pw_uid,
+                               pwd->pw_gid),
                        PDB_DEFAULT);
-               pdb_set_dir_drive(user, talloc_sub_specified(user, 
-                       lp_logon_drive(), pwd->pw_name, NULL, domain, 
pwd->pw_uid, pwd->pw_gid),
+               ok &= pdb_set_homedir(
+                       user,
+                       talloc_sub_specified(
+                               user,
+                               lp_logon_home(),
+                               pwd->pw_name,
+                               NULL,
+                               domain,
+                               pwd->pw_uid,
+                               pwd->pw_gid),
                        PDB_DEFAULT);
-               pdb_set_logon_script(user, talloc_sub_specified(user, 
-                       lp_logon_script(), pwd->pw_name, NULL, domain, 
pwd->pw_uid, pwd->pw_gid),
+               ok &= pdb_set_dir_drive(
+                       user,
+                       talloc_sub_specified(
+                               user,
+                               lp_logon_drive(),
+                               pwd->pw_name,
+                               NULL,
+                               domain,
+                               pwd->pw_uid,
+                               pwd->pw_gid),
                        PDB_DEFAULT);
+               ok &= pdb_set_logon_script(
+                       user,
+                       talloc_sub_specified(
+                               user,
+                               lp_logon_script(),
+                               pwd->pw_name,
+                               NULL,
+                               domain,
+                               pwd->pw_uid,
+                               pwd->pw_gid),
+                       PDB_DEFAULT);
+               if (!ok) {
+                       return NT_STATUS_NO_MEMORY;
+               }
        }
 
        /* Now deal with the user SID.  If we have a backend that can generate 
diff --git a/source3/printing/queue_process.c b/source3/printing/queue_process.c
index 3cd53d8f39d..152b5b645ce 100644
--- a/source3/printing/queue_process.c
+++ b/source3/printing/queue_process.c
@@ -264,14 +264,20 @@ static void bq_sig_chld_handler(struct tevent_context 
*ev_ctx,
        int status;
        pid_t pid;
 
-       pid = waitpid(-1, &status, WNOHANG);
-       if (WIFEXITED(status)) {
-               DEBUG(6, ("Bq child process %d terminated with %d\n",
-                         (int)pid, WEXITSTATUS(status)));
-       } else {
-               DEBUG(3, ("Bq child process %d terminated abnormally\n",
-                         (int)pid));
-       }
+       do {
+               do {
+                       pid = waitpid(-1, &status, WNOHANG);
+               } while ((pid == -1) && (errno == EINTR));
+
+               if (WIFEXITED(status)) {
+                       DBG_INFO("Bq child process %d terminated with %d\n",
+                                (int)pid,
+                                WEXITSTATUS(status));
+               } else {
+                       DBG_NOTICE("Bq child process %d terminated 
abnormally\n",
+                                  (int)pid);
+               }
+       } while (pid > 0);
 }
 
 static void bq_setup_sig_chld_handler(struct tevent_context *ev_ctx)
@@ -302,18 +308,6 @@ static void bq_smb_conf_updated(struct messaging_context 
*msg_ctx,
        printing_subsystem_queue_tasks(state);
 }
 
-static void printing_pause_fd_handler(struct tevent_context *ev,
-                                     struct tevent_fd *fde,
-                                     uint16_t flags,
-                                     void *private_data)
-{
-       /*
-        * If pause_pipe[1] is closed it means the parent smbd
-        * and children exited or aborted.
-        */
-       exit_server_cleanly(NULL);
-}
-
 /****************************************************************************
 main thread of the background lpq updater
 ****************************************************************************/
@@ -323,20 +317,11 @@ pid_t start_background_queue(struct tevent_context *ev,
 {
        pid_t pid;
        struct bq_state *state;
-
-       /* Use local variables for this as we don't
-        * need to save the parent side of this, just
-        * ensure it closes when the process exits.
-        */
-       int pause_pipe[2];
+       int ret;
+       NTSTATUS status;
 
        DEBUG(3,("start_background_queue: Starting background LPQ thread\n"));
 
-       if (pipe(pause_pipe) == -1) {
-               DEBUG(5,("start_background_queue: cannot create pipe. %s\n", 
strerror(errno) ));
-               exit(1);
-       }
-
        /*
         * Block signals before forking child as it will have to
         * set its own handlers. Child will re-enable SIGHUP as
@@ -355,80 +340,56 @@ pid_t start_background_queue(struct tevent_context *ev,
                return pid;
        }
 
-       if (pid == -1) {
-               DEBUG(5,("start_background_queue: background LPQ thread failed 
to start. %s\n", strerror(errno) ));
-               exit(1);
-       }
-
-       if (pid == 0) {
-               struct tevent_fd *fde;
-               int ret;
-               NTSTATUS status;
-
-               /* Child. */
-               DEBUG(5,("start_background_queue: background LPQ thread 
started\n"));
+       /* Child. */
+       DEBUG(5,("start_background_queue: background LPQ thread started\n"));
 
-               close(pause_pipe[0]);
-               pause_pipe[0] = -1;
+       status = smbd_reinit_after_fork(msg_ctx, ev, true, "lpqd");
 
-               status = smbd_reinit_after_fork(msg_ctx, ev, true, "lpqd");
-
-               if (!NT_STATUS_IS_OK(status)) {
-                       DEBUG(0,("reinit_after_fork() failed\n"));
-                       smb_panic("reinit_after_fork() failed");
-               }
-
-               state = talloc_zero(NULL, struct bq_state);
-               if (state == NULL) {
-                       exit(1);
-               }
-               state->ev = ev;
-               state->msg = msg_ctx;
-
-               bq_reopen_logs(logfile);
-               bq_setup_sig_term_handler();
-               bq_setup_sig_hup_handler(state);
-               bq_setup_sig_chld_handler(ev);
-
-               BlockSignals(false, SIGTERM);
-               BlockSignals(false, SIGHUP);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(0,("reinit_after_fork() failed\n"));
+               smb_panic("reinit_after_fork() failed");
+       }
 
-               if (!printing_subsystem_queue_tasks(state)) {
-                       exit(1);
-               }
+       state = talloc_zero(NULL, struct bq_state);
+       if (state == NULL) {
+               exit(1);


-- 
Samba Shared Repository

Reply via email to